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

ANTLR左递归规则优先级异常问题咨询(版本4.13.1)

ANTLR左递归语法分支优先级问题解析

这不是ANTLR 4.13.1的Bug,是对ANTLR规则优先级处理逻辑的理解偏差导致的。

两种写法的差异原因

第一种写法:

expr : notexpr | expr '&&' expr | ID;
notexpr : '!' expr;

这里notexpr是expr的同级备选分支,和expr '&&' expr、ID优先级相同。ANTLR解析时会优先匹配最外层的完整规则分支,!a && a会被匹配为notexpr,而notexpr内的expr会覆盖后续的&& a部分,最终得到!(a && a)的解析树。

第二种写法:

expr : '!' expr | expr '&&' expr | ID;

此时'!' expr作为expr的第一个备选分支,ANTLR规则内的分支顺序直接决定匹配优先级——靠前的分支优先级更高。!作为前缀操作优先级本就高于&&,因此解析器会先匹配!a作为独立的expr,再匹配后续的&& a,得到符合预期的(!a) && a解析树。

正确的优先级定义方式

若要清晰区分操作符优先级,更推荐分层规则的常规写法:

expr       : andExpr;
andExpr    : andExpr '&&' notExpr | notExpr;
notExpr    : '!' notExpr | ID;

这种分层结构明确了!优先级高于&&,解析结果会完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:26