当前位置: 首页 > 面试题库 >

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

席宜修
2023-03-14
问题内容

JLS
v7的第18章中的语法似乎与文档中其他地方的结构不同,但是对我而言似乎有所不同。具体在第15章中,规则是:

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

这样就可以创建foo instanceof Bar一个RelationalExpression(并因此生成一个EqualityExpresson),而该关系又可以在创建EqualityExpression的EqualityExpression规则中用作LHS
foo instanceof Bar == false

但是当看第18章中的语法时,他们做了一些简化:

Expression2:
  Expression3 [Expression2Rest]

Expression2Rest:
  { InfixOp Expression3 }
  instanceof Type

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

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


问题答案:

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

仅基于第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, 它必须是 Primary 。但这不适合。

Expression3:
PrefixOp Expression3
(表达式 | 类型) Expression3
Primary {Selector} {PostfixOp}

主要:
文字
ParExpression
[Arguments]
超级 SuperSuffix
创建者
NonWildcardTypeArguments(ExplicitGenericInvocationSuffix | this
Arguments)
标识符{标识符} [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节之前的最后一句话:“关系表达式的类型始终为 boolean 。” 这与15.20中的
RelationalExpression 规则本身直接冲突。(特别是,这意味着必须将LHS的instanceof值评估为 boolean
。)不可能正确。

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

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

  • Expression2:
    Expression3 [ instanceof 类型]
    Expression2 {InfixOp Expression3}

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



 类似资料:
  • Mock.js 的语法规范包括两部分: 数据模板定义规范(Data Template Definition,DTD) 数据占位符定义规范(Data Placeholder Definition,DPD) 数据模板定义规范 DTD 数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值: // 属性名 name // 生成规则 rule // 属性值 value 'name|r

  • 9. 完整的语法规范 这是完整的Python语法,它由解析器读入用于解析Python源文件: # Grammar for Python # Note: Changing the grammar specified in this file will most likely # require corresponding changes in the parser module #

  • 在这个标准工业大行其道的今天,任何事物都有属于自己的标准或者规范。作为当下最流行的编程语言之一的 Python 当然也不例外,这节课我们就来学习下 Python 的基本语法规范: 1. 简介 本文介绍 Python 的最基本语法和功能,即:安装完 Python 后、开始学习 Python,首先需要了解的知识点。 2. 变量 2.1 什么是变量 变量是 Python 程序用来保存计算结果的存储单元,

  • 对于那些不熟悉它们的人--我正在寻找这样的文档http://docs.oracle.com/javase/specs/jls/se7/html/index.html。 提前道谢!

  • PHP 语言规范,Facebook 已经把所有该规范的版权贡献给献给 CC0 公共域协议,本规范的发布不提供任何保证,Facebook 公司在 2014 年发起该项目。