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

2023-11-24

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

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

这使得foo instanceof BarRelationalExpression(因此也是 EqualityExpresson),它又可以用作 EqualityExpression 规则中的 LHS,这使得foo instanceof Bar == false等式表达式。

但是当查看第 18 章的语法时,他们对其进行了一些简化:

Expression2:
  Expression3 [Expression2Rest]

Expression2Rest:
  { InfixOp Expression3 }
  instanceof Type

这看起来很奇怪,这意味着我们可以链接在一起Expression3s 与二元运算符 OR 我们可以检查其类型Expression3。具体现在foo instanceof Bar is an Expression2,但我不认为使用Expression2作为相等比较的 LHS。

我是否错过了第 18 章语法中的某些内容foo instanceof Bar == false有效的表达?请注意,根据第 15 章中的规则以及我的编译器,它是一个有效的表达式。


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

仅基于第 18 章中的语法:

任何带有InfixOp (e.g. ==) 要么适合表达2休息或者什么都不适合。和表达2休息只属于里面表达式2。因此,如果foo instanceof Bar == false是合法的 Java,这意味着foo instanceof Bar必须是一个表达式3.

表达式2:
表达式3 [表达式2休息]

表达式2休息:
{InfixOp 表达式3}
实例化 Type

But foo instanceof Bar不是一个表达式3。没有PrefixOp并且没有演员阵容,所以成为表达式3它必须是一个Primary。但它就是不适合。

表达式3:
前缀运算表达式3
( (表达 | Type) ) 表达式3
主要 { 选择器 } { PostfixOp }

Primary:
Literal
Par表达式
this [论点]
super 超级后缀
new Creator
NonWildcardTypeArguments(显式通用调用后缀) | this 参数)
标识符{ . 标识符 } [标识符后缀]
基本类型{ [] }* .class
无效类

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

当然这是废话。foo instanceof Bar产生一个布尔结果,并且该结果当然可以与false。表达式编译并运行。

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

第 2.3 节指出

A 句法语法第 4、6-10、14 和 15 章给出了 Java 编程语言的语法。...第 18 章还给出了 Java 编程语言的句法语法,它更适合于实现而不是阐述。

根据第 15 章中介绍的语法规则,foo instanceof Bar == false is合法的 Java 表达式。但请查看第 15.20.1 节之前的最后一句:“关系表达式的类型始终是boolean”这直接与关系表达式15.20 中自行规定。 (特别是,它意味着 LHSinstanceof必须评估为boolean.) 这不可能是真的。

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

我认为如果他们改变表达式2规则一点点,第18章可能是对的。就像这样:

*表达式2:
表达式3 [ 实例化 Type ]
表达式2 {InfixOp 表达式3}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java7规范中的语法真的等效吗? 的相关文章

随机推荐