关于ANTLR v4规则优先级的困惑



ANTLR网站上的示例(https://www.antlr.org/)使*//的优先级高于+/-,但我对其含义感到困惑。

grammar Expr;       
prog:   (expr NEWLINE)* ;
expr:   expr ('*'|'/') expr
|   expr ('+'|'-') expr
|   INT
|   '(' expr ')'
;
NEWLINE : [rn]+ ;
INT     : [0-9]+ ;

因为我认为这是自上而下的解析,如果我们输入100+2*34,则应该首先选择*//规则,使其在解析树中更高,因此结果应该被解释为(100+2)*34。但从网站上生成的解析树来看,它是100+(2*34)。有人能帮我澄清一下吗?

运算符的优先级实际上是由expr规则中备选项的顺序定义的。我假定通过";在解析树中更高";你的意思是自上而下打印树时的垂直位置,对吗?但是,当谈到树节点的位置时,通常使用树级别(根级别为0(。因此,一个节点在树中越深,它的位置就越高。

解决了这个问题,我们现在可以看看你的问题:当然,优先级较低的运算符(这里是加号和减号(应该出现在较低的级别(更靠近根节点(,因为表达式的求值从叶开始,也就是最深的树级别。

相关内容

  • 没有找到相关文章

最新更新