[英]Associativity and precedence of Java operators in ANTLRv4 grammar
我试图了解antlr4的功能,并仔细阅读了参考代码和这本书,并对Java.g4中的“表达式”规则有疑问( https://raw.githubusercontent.com/antlr/grammars- v4 / master / java / Java.g4 )和该书(2012年第二版,第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中^具有不同的含义。
正确的答案是在Java语言规范中 。 我们将关注当前的规范,即Java SE 8 。
在语言描述中,我们对有关二进制运算符表达式 (15.2 表达式形式)的三个小节感兴趣。 描述越早的听证者拥有更高的优先权 。
运算符+和-称为加法运算符 。
然后我们读到:
加法运算符具有相同的优先级,并且在语法上是左关联的 (它们的组从左到右)。
按位运算符和逻辑运算符包括AND运算符&, 异或运算符^和异或运算符|。
然后我们读到:
这些运算符中的每一个在语法上都是左关联的 (每个组从左到右)
赋值运算符是:
= *= /= %= += -= <<= >>= >>>= &= ^= |=
有12个赋值运算符; 在语法上都是右联想 。
这允许链接分配 。
在Java 8中, 加号plus运算符+
的优先级高于互斥OR运算符^
。 XOR ^
运算符和加法加运算符+
是左关联的 。 赋值运算符的右相关性 (例如^=
)允许使用链式赋值 。
您粘贴的Java.g4代码段是正确的 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.