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