Antlr语法歧义无法消解,算术表达式优先级规则未生效如何解决
问题根因
你遇到的解析错误核心来自两个常见问题:
- 空白符规则遗漏了普通空格匹配:你当前的
WS词法规则仅跳过制表符、回车、换行符,算术表达式中运算符和操作数之间的普通空格没有被设置为跳过,导致解析器识别输入时出现匹配异常。 - 同规则内定义优先级的写法容易出现隐式问题:虽然ANTLR4支持在同一条规则内通过候选项顺序定义优先级,但将不同优先级的运算拆分到独立规则的写法可读性更高,也能避免优先级匹配异常。
修复后的完整语法文件
/*Productions */ // 最低优先级:加减运算,左结合 expr: expr ('+'|'-') term | term ; // 次高优先级:乘除运算,左结合 term: term ('*'|'/') factor | factor ; // 最高优先级:括号、标识符、数字 factor: '(' expr ')' | ID | NUM ; /*Tokens */ ID: [a-z]+; NUM: [0-9]+; // 新增空格字符匹配,跳过所有空白类字符 WS: [ \t\r\n]+ -> skip;
Windows下正确测试步骤
- 首先确保你已经正确配置了ANTLR4环境,包括
antlr4和grun命令可以正常调用 - 在
arithmetic.g4所在目录打开CMD窗口,依次执行以下命令:- 生成解析器代码:
antlr4 arithmetic.g4- 编译生成的Java代码:
javac arithmetic*.java- 启动测试工具,输入
4 * (3 + 10)后按Ctrl+Z再回车即可看到正确的解析树:
grun arithmetic expr -gui
内容的提问来源于stack exchange,提问作者Hassan Zaidi
相关产品推荐
相关产品推荐

