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

Antlr解析器提前匹配错误规则引发数组越界异常求助

修复Antlr语法解析a = a xor b的错误问题

问题根源

  1. 词法规则冲突:原语法中REGISTER规则包含REG_A,导致词法分析时'a'可能被匹配为多个词法符号,引发识别混乱。
  2. 语法规则缺失:expression规则引用了or但未定义对应规则,xor规则中的reg8未定义,导致解析器无法正确识别运算表达式。
  3. 规则歧义与输入截断: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:44