我试图理解antlr4的功能,并浏览参考代码和书籍,我对Java.g4(https://raw.githubusercontent.com/antlr/grammars-v4/master/java/Java.g4)和书中的'表达'规则有疑问(第2章) ed 2012,page 73):
根据该书,“+”的优先级低于“^”,因此“+”规则低于“^”规则。但Java代码恰恰相反。
根据这本书,'^'规则有assoc = right。但是除了'^ ='和类似的规则之外,Java代码没有它。
哪个是正确的,书还是代码?
顺便说一下,代码和书之间还有另一个区别。在代码中,assoc = right位于规则的开头,而在书中它位于运算符之后,但看起来语法已更改(代码适用于4.5.3)并且必须更新本书此以下是相关的Java.g4代码段:
expression
: primary
| expression ('*'|'/'|'%') expression
| expression ('+'|'-') expression
| expression '^' expression
// this indicates that precedence is: * > + > ^
// BUT it SHOULD be: ^ > * > +
// and both + and ^ are assoc=left
// BUT it SHOULD be: LEFT for + and RIGHT for ^
| <assoc=right> expression
( '='
| '+='
| '^='
)
expression
;
注意:在上面的问题中,我假设^意味着取幂,但正如答案所指出的那样,在java ^中有不同的含义。
答案 0 :(得分:0)
正确答案位于Java language specification。我们将重点关注当前的规范,即 Java SE 8 。
在语言描述中,我们对二元运算符表达式(15.2表达式)的三个小节感兴趣。 较早的操作符描述了它具有的优先级。
运算符+和 - 称为加法运算符。
然后我们读到:
加法运算符具有相同的优先级,并且在语法上左关联(它们从左到右分组)。
按位运算符和逻辑运算符包括AND运算符&amp;,异或运算符^ ,以及包含OR运算符|。
然后我们读到:
每个运算符在语法上都是左关联(每个组从左到右)
赋值运算符是:
= *= /= %= += -= <<= >>= >>>= &= ^= |=
有12个赋值运算符;所有语法都是右关联。
在Java 8中,添加加运算符+
的优先级高于异或运算符^
。 XOR ^
运算符和添加运算符加运算符+
是左关联。 Right-associativity of assignment operators(例如^=
)允许chained assignment。
您粘贴的 Java.g4代码段 正确。