Python ANTLR解析器报错:输入'='不匹配,请求解决
问题分析与解决方案:ANTLR解析"="符号时的不匹配错误
问题描述
测试用例内容:
[* 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
解析时触发错误:
line 2:0 mismatched input '=' expecting {'function', 'if', 'while', 'return', 'scan', 'print', 'integer', 'boolean', 'real', '{', IDENTIFIER}
使用的RAT24S.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;
错误原因
- 语法规则限制:你的语法中,
=是赋值语句(assignStatement)的一部分,但赋值语句必须以标识符开头,格式为identifier ASSIGN expression SEMICOLON。单独的=不符合任何顶层语法规则(program仅接受函数定义、声明、完整语句),因此解析器抛出不匹配错误。 - 未处理的无效字符:
IGNORED_CHAR规则没有设置-> skip,#、_等字符会被当作有效token,但顶层规则不接受,会引发后续错误。 - 测试用例存在非法内容:测试用例中的
=>不是定义的运算符,会被拆分为=和>两个token;endif未被定义为关键字,会被识别为标识符;000.、.123不符合REAL_LITERAL的匹配规则。
解决方案
1. 修正测试用例中的赋值语句
将单独的=改为合法的赋值语句,例如:
x = 10; y = 20 + 3;
2. 配置忽略无效字符
给IGNORED_CHAR规则添加跳过逻辑:
IGNORED_CHAR : [#._] -> skip;
3. 清理测试用例中的非法内容
- 移除
=>这类未定义的运算符; - 移除
endif这类非关键字内容,或在语法中添加对应的关键字定义; - 调整
REAL_LITERAL规则以支持更多格式(如可选整数/小数部分):REAL_LITERAL : ([0-9]+ '.' [0-9]*) | ('.' [0-9]+);
4. 可选:支持顶层表达式语句(若业务需要)
如果需要解析独立的表达式,可扩展statement规则:
statement : assignStatement | ifStatement | whileStatement | returnStatement | printStatement | scanStatement | compoundStatement | expression SEMICOLON; // 新增表达式语句
注:单独的=仍不属于合法表达式,此修改仅支持a + b;这类完整表达式。
验证示例
调整后的合法测试用例片段:
[* operator test *] x = 10; y != 20; z > 5; [* separator test *] $ { } ; , () x = 3; [* keyword *] integer a; boolean b; real c; if (x>0) {x=x+1;} else {x=0;} return 5; scan(y); while (y<10) {y=y+1;} endwhile true false [* integer *] 1 1000 99 00000000000000 [* real *] 234.567 9.000001 000.00 .123 [* identifier *] z12_d_ Zzzz a1z4r zbc12__x x
内容的提问来源于stack exchange,提问作者user18464296
相关产品推荐
相关产品推荐

