Java7规范中的语法真的等价吗?

Java7规范中的语法真的等价吗?,java,java-7,grammar,language-lawyer,Java,Java 7,Grammar,Language Lawyer,JLSV7中的语法似乎与文档中其他地方的构造有所不同,但对我来说似乎有所不同。具体而言,第15章规定如下: RelationalExpression: ShiftExpression RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression

JLSV7中的语法似乎与文档中其他地方的构造有所不同,但对我来说似乎有所不同。具体而言,第15章规定如下:

RelationalExpression:
  ShiftExpression
  RelationalExpression < ShiftExpression
  RelationalExpression > ShiftExpression
  RelationalExpression <= ShiftExpression
  RelationalExpression >= ShiftExpression
  RelationalExpression instanceof ReferenceType
这看起来很奇怪,这意味着我们可以用二进制运算符将
Expression3
s链接在一起,或者我们可以检查一个
Expression3
的类型。特别是现在的
foo-instanceof-Bar
是一个
表达式2
,但我不认为使用
表达式2
作为相等比较的LHS是有效的


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

这个问题应该得到一个很好的答案,所以让我们仔细地看一下。 仅基于第18章中的语法:

任何带有InfixOp的内容(例如
==
)要么适合Expression2Rest,要么不适合任何内容。而Expression2Rest只属于Expression2内部。因此,如果
foo instanceof Bar==false
是合法的Java,这意味着
foo instanceof Bar
必须是一个表达式3

表达式2:
表达式3[Expression2Rest]

Expression2Rest:
{InfixOp Expression3}
类型的实例

但是
foo instanceof Bar
不是一个表达式3。没有前缀和强制转换,所以要成为表达式3,它必须是主表达式。但它就是不合适

表达式3:
前缀表达式3
(表达式类型)表达式3
主{Selector}{postfix}

主要:
文字
ParExpression
这个[参数]
superSuperSuffix
新建创建者
非通配符类型参数(ExplicitGenericInvocationSuffix | 参数)
标识符{.Identifier}[IdentifierSuffix]
基本类型{[]}*.class
void.class

结论:仅根据第18章中介绍的语法,
foo instanceof Bar==false
不是合法的Java表达式

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

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

第2.3节规定:

Java编程语言的语法在第4、6-10、14和15章中给出。。。第18章还给出了Java编程语言的语法,它比说明更适合于实现

根据第15章介绍的语法规则,
foo instanceof Bar==false
是一个合法的Java表达式。但请查看第15.20.1节之前的最后一句话:“关系表达式的类型始终是布尔值”,这与15.20中的关系表达式规则本身直接冲突。(特别是,它意味着
instanceof
的LHS必须计算为布尔值)这不可能是真的

最好的结论:这本书有问题。如果您想知道某个东西是否是合法的Java,您必须编译并运行它,最好是在Oracle的参考实现上。即使这样,也可能会有虫子。毕竟,这只是软件

我认为如果他们稍微改变一下表达规则,第18章可能是正确的。像这样:

*表达式2:
表达式3[实例类型]
表达式2{InfixOp表达式3}


但谁知道呢,这可能会导致其他问题。在任何情况下,它都是用Java 8修复的。

在我看来,这似乎是规范中的一个bug。请注意,使用与第15章相同的语法。为什么
foo instanceof Bar==false
是一个有效表达式会出现问题?我刚刚检查了它,编译器接受了它。@Clashsoft不是问题,只是根据后面的语法它不是:
foo instanceof Bar
是一个
Expression2
,但是
x==y
的LHS应该是一个
Expression3
。当然,除非我错过了什么——这(我错过的)将是我问题的答案。
Expression2:
  Expression3 [Expression2Rest]

Expression2Rest:
  { InfixOp Expression3 }
  instanceof Type