繁体   English   中英

ANTLRv4语法中Java运算符的关联性和优先级

[英]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页):

  1. 根据这本书,“ +”优先级低于“ ^”,因此“ +”规则低于“ ^”规则。 但是Java代码则相反。

  2. 根据这本书,“ ^”规则具有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 表达式形式)的三个小节感兴趣。 描述越早的听证者拥有更高的优先权

15.18加法运算符(第563页)

运算符+和-称为加法运算符

然后我们读到:

加法运算符具有相同的优先级,并且在语法上是左关联的 (它们的组从左到右)。

15.22按位和逻辑运算符(第575页)

按位运算符和逻辑运算符包括AND运算符&, 异或运算符^异或运算符|。

然后我们读到:

这些运算符中的每一个在语法上都是左关联的 (每个组从左到右)

15.26分配运算符(第588页)

赋值运算符是:

= *= /= %= += -= <<= >>= >>>= &= ^= |=

有12个赋值运算符; 在语法上都是右联想

这允许链接分配

结论

在Java 8中, 加号plus运算符+的优先级高于互斥OR运算符^ XOR ^运算符加法加运算符+左关联的 赋值运算符的右相关性 (例如^= )允许使用链式赋值

您粘贴的Java.g4代码段正确的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM