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
看起来很奇怪,这意味着我们可以将Expression3
s与二进制运算符链接在一起,或者可以检查一个的类型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 年发起该项目。