ANTLR默认分支选择逻辑咨询及单数字触发多余标签问题排查
解析单个数字却触发Plus/Multiplication标签的原因及解决办法
这种情况我之前也碰到过,大概率是你参考的语法规则里标签(label)的位置设置不对导致的——简单来说,就是把包含可选运算符的整个规则打上了标签,哪怕输入里没有运算符,只要匹配了规则的“零次重复”部分,解析树就会触发对应的标签。
问题根源示例
比如shmatov的计算器语法可能是这样写的(简化版):
expr : term (('+' | '-') term)* #Plus // 标签打在整个规则上 ; term : factor (('*' | '/') factor)* #Multiplication // 同上 ; factor : NUMBER ;
当你输入单个数字5时,虽然没有+或*,但term (('+' | '-') term)*会匹配term(也就是factor→NUMBER),因为*允许零次重复运算符部分。这时候整个expr规则会触发#Plus标签,term规则触发#Multiplication标签,就出现了你看到的奇怪现象。
正确的写法
要解决这个问题,应该把标签只打在包含运算符的分支上,单独为“单个项”的分支设置独立标签(或者不打标签也行,但打标签更清晰):
expr : expr '+' term #Plus // 只有带+的分支才触发#Plus | expr '-' term #Minus | term #ExprSingleTerm // 单个项走这个分支 ; term : term '*' factor #Multiplication // 只有带*的分支才触发#Multiplication | term '/' factor #Division | factor #TermSingleFactor // 单个因子走这个分支 ; factor : NUMBER ;
这样输入单个数字时,解析树会走#ExprSingleTerm→#TermSingleFactor→NUMBER,就不会错误触发Plus或Multiplication标签了。
验证方法
打开你的.g4语法文件,检查expr和term规则的标签位置:如果标签是跟在整个规则的末尾(比如...)* #Plus),那就是这个问题;改成按分支打标签就好了。
内容的提问来源于stack exchange,提问作者Bankst
相关产品推荐
相关产品推荐

