Java语法定义完整性

lle*_*edr 5 java grammar jls

虽然JLS规范中似乎非常精确地描述了Java语法,但是有一些具体案例我无法应用于给定的定义.

例如,采用ClassInstanceCreationExpressionJLS8第15.9章中的规则,非限定new表达式应采用以下形式:

new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody] 
Run Code Online (Sandbox Code Playgroud)

Identifier是一个标准的Java标识符(基本上是Java字母/数字,没有点).

该定义如何应用于静态嵌套类instanciation等有效表达式:

new C1.C2();
Run Code Online (Sandbox Code Playgroud)

或包合格的类instanciation:

new java.lang.String("foo");
Run Code Online (Sandbox Code Playgroud)

鉴于点不能成为一部分Identifier

请注意,对于非限定new表达式,此定义从JLS7更改为JLS8,其中JLS7 表示:

new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]
Run Code Online (Sandbox Code Playgroud)

TypeDeclSpecifier 被定义为:

TypeDeclSpecifier:
    TypeName
    ClassOrInterfaceType . Identifier 
Run Code Online (Sandbox Code Playgroud)

允许new静态嵌套类和包限定类的非限定表达式.

ric*_*ici 5

这似乎是规范中的一个错误.

引用与上面链接的错误报告(说明中的第三点):

  1. 语法没有为以下表达式定义任何生成:new java.security.Permissions()

这是TypeDeclSpecifier4.3 中删除的副作用,因为它与类型注释相互作用很差.JSR 308 Public Review指出:"TypeDeclSpecifier是Java语言规范中比较模糊的非终结符之一.它仅用于少数几种情况:类声明的extends和implements子句(8.1.4,8.1.5) ),接口声明(9.1.3)的extends子句,以及类实例创建表达式(15.9)的语法.使用它的原因是禁止使用通配符类型参数(尽管9.1.3实际上没有这样做) ,但如果没有专用的非终端设备,这可以同样实现."