You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

错误原因

  1. 语法规则限制:你的语法中,=是赋值语句(assignStatement)的一部分,但赋值语句必须以标识符开头,格式为identifier ASSIGN expression SEMICOLON。单独的=不符合任何顶层语法规则(program仅接受函数定义、声明、完整语句),因此解析器抛出不匹配错误。
  2. 未处理的无效字符:IGNORED_CHAR规则没有设置-> skip,#、_等字符会被当作有效token,但顶层规则不接受,会引发后续错误。
  3. 测试用例存在非法内容:测试用例中的=>不是定义的运算符,会被拆分为=和>两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:32:00