有关我的 Python ANTLR 解析器代码的错误

问题描述 投票:0回答:1

我正在尝试解析测试用例文件的内容,以将文件输出到显示令牌类型和生产规则的位置。

我的测试用例是这样的:

[* operator test *] = != > < <= => + - * / == +-*/w  [* separator test *] $ { } ; , () = )(  [* keyword *] integer  boolean   real  {} ; ,  if else endif return scan while endwhile  true false   [* integer *] 1 1000 99 00000000000000  [* real *] 234.567 9.000001 000.00  [* identifier *] z12_d_ Zzzz a1z4r zbc12__x  x  [* wrongTokens *]   #   _   23rty   000.   .123

现在我收到这个错误,只有这个错误,我不明白为什么

第 2:0 行不匹配的输入 '=' 需要 {'function', 'if', 'while', 'return', 'scan', 'print', 'integer', 'boolean', 'real', '{ ',标识符}

我的规则/语法的 g4 文件位于下面,我只想让我的解析器将“=”识别为输出。


grammar RAT24S;

program             : (functionDefinition | declaration | statement)+ EOF;

functionDefinition  : FUNCTION identifier '(' parameterList? ')' LBRACE body RBRACE;
parameterList       : parameter (COMMA parameter)*;
parameter           : qualifier identifier;
body                : (declaration | statement)*;
declaration         : qualifier identifier (COMMA identifier)* SEMICOLON;
statement           : assignStatement
                    | ifStatement
                    | whileStatement
                    | returnStatement
                    | printStatement
                    | scanStatement
                    | compoundStatement;

assignStatement     : identifier ASSIGN expression SEMICOLON ;
ifStatement         : IF LPAREN expression RPAREN statement (ELSE statement)?;
whileStatement      : WHILE LPAREN expression RPAREN statement;
returnStatement     : RETURN expression? SEMICOLON;
printStatement      : PRINT LPAREN expression RPAREN SEMICOLON;
scanStatement       : SCAN LPAREN identifier RPAREN SEMICOLON;
compoundStatement   : LBRACE statement* RBRACE;

expression          : term (add_op term)*;
term                : factor (mul_op factor)*;
factor              : identifier
                    | INTEGER_LITERAL
                    | REAL_LITERAL
                    | LPAREN expression RPAREN;

identifier          : IDENTIFIER;

qualifier           : INTEGER
                    | BOOLEAN
                    | REAL;

// Tokens
FUNCTION            : 'function';
IF                  : 'if';
ELSE                : 'else';
WHILE               : 'while';
RETURN              : 'return';
SCAN                : 'scan';
PRINT               : 'print';
TRUE                : 'true';
FALSE               : 'false';
INTEGER             : 'integer';
BOOLEAN             : 'boolean';
REAL                : 'real';
VOID                : 'void';
PUBLIC              : 'public';
PRIVATE             : 'private';
ENDWHILE            : 'endwhile';

ASSIGN              : '=';
ADD                 : '+';
SUB                 : '-';
MUL                 : '*';
DIV                 : '/';
EQ                  : '==';
NE                  : '!=';
LT                  : '<';
LE                  : '<=';
GT                  : '>';
GE                  : '>=';
INC                 : '++';
DEC                 : '--';

LPAREN              : '(';
RPAREN              : ')';
LBRACE              : '{';
RBRACE              : '}';
SEMICOLON           : ';';
COMMA               : ',';
WS                  : [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines
COMMENT             : '[*' .*? '*]' -> skip; // skip comments enclosed in [* *]

IDENTIFIER          : [a-zA-Z] [a-zA-Z0-9_]*;
INTEGER_LITERAL     : [0-9]+;
REAL_LITERAL        : [0-9]+ '.' [0-9]+;

// Define explicit tokens for characters to avoid implicit token creation
SEPARATOR           : '$';
IGNORED_CHAR        : [#._]; // Ignore these characters

// Operator tokens
add_op              : ADD | SUB;
mul_op              : MUL | DIV;


python parsing antlr antlr4 lexical-analysis
1个回答
0
投票

您的词法分析器规则没有任何问题。根据您的示例输入,词法分析器成功创建了以下 63 个标记:

63 tokens:
  1    ASSIGN                         '='
  2    NE                             '!='
  3    GT                             '>'
  4    LT                             '<'
  5    LE                             '<='
  6    ASSIGN                         '='
  7    GT                             '>'
  8    ADD                            '+'
  9    SUB                            '-'
  10   MUL                            '*'
  11   DIV                            '/'
  12   EQ                             '=='
  13   ADD                            '+'
  14   SUB                            '-'
  15   MUL                            '*'
  16   DIV                            '/'
  17   IDENTIFIER                     'w'
  18   SEPARATOR                      '$'
  19   LBRACE                         '{'
  20   RBRACE                         '}'
  21   SEMICOLON                      ';'
  22   COMMA                          ','
  23   LPAREN                         '('
  24   RPAREN                         ')'
  25   ASSIGN                         '='
  26   RPAREN                         ')'
  27   LPAREN                         '('
  28   INTEGER                        'integer'
  29   BOOLEAN                        'boolean'
  30   REAL                           'real'
  31   LBRACE                         '{'
  32   RBRACE                         '}'
  33   SEMICOLON                      ';'
  34   COMMA                          ','
  35   IF                             'if'
  36   ELSE                           'else'
  37   IDENTIFIER                     'endif'
  38   RETURN                         'return'
  39   SCAN                           'scan'
  40   WHILE                          'while'
  41   ENDWHILE                       'endwhile'
  42   TRUE                           'true'
  43   FALSE                          'false'
  44   INTEGER_LITERAL                '1'
  45   INTEGER_LITERAL                '1000'
  46   INTEGER_LITERAL                '99'
  47   INTEGER_LITERAL                '00000000000000'
  48   REAL_LITERAL                   '234.567'
  49   REAL_LITERAL                   '9.000001'
  50   REAL_LITERAL                   '000.00'
  51   IDENTIFIER                     'z12_d_'
  52   IDENTIFIER                     'Zzzz'
  53   IDENTIFIER                     'a1z4r'
  54   IDENTIFIER                     'zbc12__x'
  55   IDENTIFIER                     'x'
  56   IGNORED_CHAR                   '#'
  57   IGNORED_CHAR                   '_'
  58   INTEGER_LITERAL                '23'
  59   IDENTIFIER                     'rty'
  60   INTEGER_LITERAL                '000'
  61   IGNORED_CHAR                   '.'
  62   IGNORED_CHAR                   '.'
  63   INTEGER_LITERAL                '123'
© www.soinside.com 2019 - 2024. All rights reserved.