【问题标题】:Java grammar definition completenessJava语法定义完整性
【发布时间】:2014-10-11 10:06:30
【问题描述】:

虽然 JLS 规范中似乎对 Java 语法进行了非常精确的描述,但在某些具体情况下我未能将其应用于给定的定义。

以JLS8第15.9章中的ClassInstanceCreationExpression规则为例,非限定new表达式应为:

new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody] 

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

此定义如何应用于静态嵌套类实例化等有效表达式:

new C1.C2();

或包限定的类实例化:

new java.lang.String("foo");

鉴于点不能成为Identifier 的一部分?

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

new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]

TypeDeclSpecifier 被定义为:

TypeDeclSpecifier:
    TypeName
    ClassOrInterfaceType . Identifier 

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

【问题讨论】:

    标签: java grammar jls


    【解决方案1】:

    在规范中好像是bug

    引用上面链接的错误报告(描述中的第三点):

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

    这是在 4.3 中删除 TypeDeclSpecifier 的副作用,因为它与类型注释的交互很差。 JSR 308 Public Review 指出:“TypeDeclSpecifier 是 Java 语言规范中比较晦涩的非终结符之一。它仅在少数情况下使用:类声明的 extends 和 implements 子句(8.1.4、8.1.5 )、接口声明的扩展子句 (9.1.3) 和类实例创建表达式的语法 (15.9)。使用它的原因是禁止通配符类型参数(尽管 9.1.3 实际上没有这样做) ,但是如果没有专用的非终端,这同样可以很好地实现。”

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2014-01-31
      • 2012-01-08
      • 2012-03-06
      相关资源
      最近更新 更多