Antlr解析器提前匹配错误规则引发数组越界异常求助
修复Antlr语法解析
a = a xor b的错误问题 问题根源
- 词法规则冲突:原语法中
REGISTER规则包含REG_A,导致词法分析时'a'可能被匹配为多个词法符号,引发识别混乱。 - 语法规则缺失:
expression规则引用了or但未定义对应规则,xor规则中的reg8未定义,导致解析器无法正确识别运算表达式。 - 规则歧义与输入截断:
statement的两个规则存在歧义,解析器错误将a = a xor b拆解为a = b,剩余的xor部分无匹配规则,最终抛出数组越界异常。
修复后的完整语法
grammar somename; options { language = CSharp; } program: line* EOF; line: statement (NEWLINE+ | EOF); // 优先匹配a专属运算,再处理普通赋值 statement: aOperation | registerAssignment; // 定义合法的运算表达式:or/xor 操作 expression: orExpr | xorExpr; orExpr: OR reg; xorExpr: XOR reg; // 明确所有合法寄存器类型 reg: REG_A | REG_B | REG_C | REG_D | MEM_E; // a专属运算的严格规则:必须是a = a 后跟运算 aOperation: REG_A '=' REG_A expression; // 普通寄存器赋值规则 registerAssignment: reg '=' reg; // 词法规则:每个寄存器单独定义,消除歧义 REG_A: 'a'; REG_B: 'b'; REG_C: 'c'; REG_D: 'd'; MEM_E: '&e'; OR: 'or'; XOR: 'xor'; WHITESPACE: (' ' | '\t')+ -> skip; NEWLINE: ('\r'? '\n' | '\r');
关键修复点
- 消除词法歧义:将每个通用寄存器(a/b/c/d)和内存寄存器(&e)单独定义为词法规则,避免同一符号被匹配为多个词法类型。
- 补全缺失规则:新增
orExpr规则,修正xorExpr的操作数为合法的reg类型,确保运算表达式能被正确识别。 - 明确规则优先级:
statement中优先匹配aOperation,确保a = a xor b这类专属运算不会被错误拆解为普通赋值。 - 修正寄存器定义:移除未定义的
hl_read和REGISTER8,明确reg规则包含所有合法寄存器。
内容的提问来源于stack exchange,提问作者Sousuke
相关产品推荐
相关产品推荐

