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(。因此,一个节点在树中越深,它的位置就越高。
解决了这个问题,我们现在可以看看你的问题:当然,优先级较低的运算符(这里是加号和减号(应该出现在较低的级别(更靠近根节点(,因为表达式的求值从叶开始,也就是最深的树级别。