Java 7语法中的分隔标识符是否可以简化为限定标识符?

时间:2016-02-11 12:18:03

标签: java syntax java-7 grammar jls

Java 7 syntax specification指定QualifiedIdentifier,其中包含:

QualifiedIdentifier:
    Identifier { . Identifier }

在语法的后面部分中,此构造再次出现而不是限定标识符:

ImportDeclaration: 
    import [static] Identifier { . Identifier } [. *] ;
Primary:
    Identifier { . Identifier } [IdentifierSuffix]

为什么这些部件明确地列在这样?他们不能简单地沦为:

ImportDeclaration: 
    import [static] QualifiedIdentifier [. *] ;
Primary:
    QualifiedIdentifier [IdentifierSuffix]

1 个答案:

答案 0 :(得分:2)

The One True Grammar

首先,要了解您引用的语法(JLS 7第18章)实际上并不是“Java 7语法规范”(例如The One True Grammar)。 语法描述了Java 7语法。还有其他一些,包括同一JLS文档前面章节中的一个。 JLS本身在section 2.3, The Syntactic Grammar中阐明了这一点:

  

第4章,第6-10,14和第15章给出了Java编程语言的语法语法。该语法具有由词法语法定义的标记作为其终端符号。它定义了一组产品,从目标符号CompilationUnit(第7.3节)开始,描述了令牌序列如何形成语法正确的程序。

     

第18章还给出了Java编程语言的语法语法,比展示更适合实现。两种句法语法都接受相同的语言。

Chapter 18的介绍解释了其中的语法专门用于参考实现:

  

前面章节(第2.3节)中逐段呈现的语法对于说明来说要好得多,但它不适合作为解析器的基础。本章介绍的语法是参考实现的基础。

因此,没有单一规范Java语法。只有语言语法本身,可以用多种语法表示。

拟议的替代方案是否可以接受?

OP询问是否

ImportDeclaration: 
    import [static] QualifiedIdentifier [. *] ;
Primary:
    QualifiedIdentifier [IdentifierSuffix]

没关系。是的,当然,为什么不呢?它描述了相同的语言,所以一定没问题。

那他们为什么这么做呢?

回想一下,第18章语法的目的是作为参考实现的基础。如果你仔细观察,你会发现QualifiedIdentifier在它完全描述它所代表的“类似标识符的结构”(我发明的术语)时会被一致地使用,但不会只是它的一部分。类似于标识符的构造“。

查看ImportDeclaration,很明显可选的尾随.* 是正在导入的事物的标识符的一部分。在import java.util.*;之类的导入中,java.util部分虽然以点分隔,但实际上并不是合格标识符。表示要导入的事物的类似标识符的构造是整个短语java.util.*。因此认为将其视为QualifiedIdentifier加上可选.*类型的云。

类似的参数可用于Primary

此外,在QualifiedIdentifierImport 中使用Primary可能会使解析器更加复杂。 (我很感激真正的语言设计师在这一点上的发言。)换句话说,由于第18章语法被认为更适合实现,我不得不认为这种选择是刻意的,使实现更容易。

底线

当然,上面给出的QualifiedIdentifier的建议用法在严格的机械意义上描述了相同的语言。但是有一些语义上的原因可以选择语法,而且可能还有实现原因。