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

Antlr语法歧义无法消解,算术表达式优先级规则未生效如何解决

问题根因

你遇到的解析错误核心来自两个常见问题:

  1. 空白符规则遗漏了普通空格匹配:你当前的WS词法规则仅跳过制表符、回车、换行符,算术表达式中运算符和操作数之间的普通空格没有被设置为跳过,导致解析器识别输入时出现匹配异常。
  2. 同规则内定义优先级的写法容易出现隐式问题:虽然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窗口,依次执行以下命令:
    1. 生成解析器代码:
    antlr4 arithmetic.g4
    
    1. 编译生成的Java代码:
    javac arithmetic*.java
    
    1. 启动测试工具,输入4 * (3 + 10)后按Ctrl+Z再回车即可看到正确的解析树:
    grun arithmetic expr -gui
    

内容的提问来源于stack exchange,提问作者Hassan Zaidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:24:01