Java7规范中的语法是否真的相同?

时间:2015-06-16 07:50:24

标签: java java-7 grammar language-lawyer

JLS v7 chapter 18中的语法似乎与文档中其他地方的结构不同,但对我来说似乎存在差异。特别是在第15章中,规则是:

RelationalExpression:
  ShiftExpression
  RelationalExpression < ShiftExpression
  RelationalExpression > ShiftExpression
  RelationalExpression <= ShiftExpression
  RelationalExpression >= ShiftExpression
  RelationalExpression instanceof ReferenceType

使foo instanceof Bar成为一个RelationalExpression(因此也就是EqualityExpresson),它又可以在EqualityExpression规则中用作LHS,使foo instanceof Bar == false成为EqualityExpression。

但是当看到第18章的语法时,他们已经简化了一点:

Expression2:
  Expression3 [Expression2Rest]

Expression2Rest:
  { InfixOp Expression3 }
  instanceof Type

这看起来很奇怪,这意味着我们可以将Expression3与二元运算符链接在一起,或者我们可以检查一个Expression3的类型。具体来说,现在foo instanceof BarExpression2,但我不认为使用Expression2作为平等比较的LHS是有效的。

我是否遗漏了第18章的语法,使foo instanceof Bar == false成为一个有效的表达式?请注意,根据第15章中的规则并根据我的编译器,它是一个有效的表达式。

1 个答案:

答案 0 :(得分:2)

这个问题应该得到一个很好的答案,所以让我们仔细看看。

完全基于第18章的语法:

任何带有 InfixOp 的内容(例如==)都适合 Expression2Rest 或什么都不适合。并且 Expression2Rest 仅属于 Expression2 。因此,如果foo instanceof Bar == false是合法的Java,那意味着foo instanceof Bar必须是 Expression3

  

Expression2:
   Expression3 [Expression2Rest]

     

Expression2Rest:
   {InfixOp Expression3}
   instanceof 输入

foo instanceof Bar不是 Expression3 。没有 PrefixOp 且没有强制转换,因此要成为 Expression3 ,它必须是主要。但它不合适。

  

表达式3:
   PrefixOp Expression3
   (表达式 | 类型) Expression3
  主要{选择器} {PostfixOp}

     

初级:
  立即
   ParExpression
   [参数]
  超级 SuperSuffix
   创作者
   NonWildcardTypeArguments(ExplicitGenericInvocationSuffix | this   参数)
  标识符{标识符} [IdentifierSuffix]
   BasicType { [] } * .class
  的 void.class

结论:仅基于第18章中提供的语法,foo instanceof Bar == false不是合法的Java表达式。 !?!?!

当然那是胡说八道。 foo instanceof Bar产生一个布尔结果,该结果肯定可以与false进行比较。表达式编译并运行。

更好的结论:第18章不具有权威性,但本书的其余部分是。

第2.3节说明

  

第4章,第6-10,14和第15章给出了Java编程语言的语法语法。第18章还给出了Java编程语言的语法语法,更好适合实施而不是博览会。

根据第15章中提出的语法规则,foo instanceof Bar == false 一个合法的Java表达式。但请查看第15.20.1节之前的最后一句:&#34;关系表达式的类型总是布尔。&#34;这与15.20中的 RelationalExpression 规则本身直接冲突。 (特别是,它意味着instanceof的LHS必须评估为布尔。)它可能不是真的。

Bestest结论:这本书有问题。如果你想知道某些东西是否是合法的Java,你必须编译并运行它,最好是在Oracle的参考实现上。即便如此,也可能存在错误。毕竟,这只是软件。

我认为,如果他们稍微改变了 Expression2 规则,那么第18章可能是正确的。像这样:

  

*表达式2:
   Expression3 [ instanceof 类型]
   Expression2 {InfixOp Expression3}

但谁知道,这可能会导致其他问题。无论如何,它已在Java 8中修复。