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

时间:2016-09-04 14:24:48

标签: java antlr4

我试图理解antlr4的功能,并浏览参考代码和书籍,我对Java.g4(https://raw.githubusercontent.com/antlr/grammars-v4/master/java/Java.g4)和书中的'表达'规则有疑问(第2章) ed 2012,page 73):

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

  2. 根据这本书,'^'规则有assoc = right。但是除了'^ ='和类似的规则之外,Java代码没有它。

  3. 哪个是正确的,书还是代码?

    顺便说一下,代码和书之间还有另一个区别。在代码中,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 ^中有不同的含义。

1 个答案:

答案 0 :(得分:0)

解释

正确答案位于Java language specification。我们将重点关注当前的规范,即 Java SE 8

在语言描述中,我们对二元运算符表达式(15.2表达式)的三个小节感兴趣。 较早的操作符描述了它具有的优先级

15.18加法运算符(第563页)

  

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

然后我们读到:

  

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

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

  

按位运算符和逻辑运算符包括AND运算符&amp;,异或运算符^ ,以及包含OR运算符|。

然后我们读到:

  

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

15.26分配操作员(第588页)

赋值运算符是:

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

有12个赋值运算符;所有语法都是右关联

这允许chained assignment

结论

在Java 8中,添加加运算符+ 的优先级高于异或运算符^ XOR ^运算符添加运算符加运算符+ 左关联Right-associativity of assignment operators(例如^=)允许chained assignment

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