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
相关产品推荐
相关产品推荐

