ANTLR简单表达式语法解析负数场景报错求助
问题原因
你当前的ANTLR语法触发错误的核心是一元负号的结合性未明确声明,ANTLR4处理带直接左递归的表达式规则时,未指定右结合的一元运算符会被优先级规则误判,导致-开头的表达式无法被正确匹配。另外你当前语法里MOD运算符的优先级设置错误,被放在了加减运算符之后,不符合常规运算逻辑。
修复方案
仅需要调整expr规则的分支顺序,同时给一元负号明确右结合属性即可:
expr: <assoc=right> MIN expr // 明确一元负号右结合,保持最高优先级 | expr ( MUL | DIV | MOD ) expr // 把MOD调整到和乘除同优先级 | expr ( ADD | MIN) expr | NUM | ID | STRING | function | '(' expr ')' ;
验证效果
修改后:
- 单个负数
-1.344会被正确解析为一元负号作用于数字1.344 - 函数调用
abs(-1.324)内的负数参数会被识别为合法的expr表达式,不再抛出匹配错误
额外注意你贴出的代码中STRING规则里的"是HTML转义后的内容,实际编写语法时要替换为普通双引号"。
内容的提问来源于stack exchange,提问作者Veryon890
相关产品推荐
相关产品推荐

