Java 7 syntax specification指定QualifiedIdentifier
,其中包含:
QualifiedIdentifier:
Identifier { . Identifier }
在语法的后面部分中,此构造再次出现而不是限定标识符:
ImportDeclaration:
import [static] Identifier { . Identifier } [. *] ;
Primary:
Identifier { . Identifier } [IdentifierSuffix]
为什么这些部件明确地列在这样?他们不能简单地沦为:
ImportDeclaration:
import [static] QualifiedIdentifier [. *] ;
Primary:
QualifiedIdentifier [IdentifierSuffix]
答案 0 :(得分:2)
首先,要了解您引用的语法(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
。
此外,在QualifiedIdentifier
或Import
中使用Primary
可能会使解析器更加复杂。 (我很感激真正的语言设计师在这一点上的发言。)换句话说,由于第18章语法被认为更适合实现,我不得不认为这种选择是刻意的,使实现更容易。
当然,上面给出的QualifiedIdentifier
的建议用法在严格的机械意义上描述了相同的语言。但是有一些语义上的原因可以选择语法,而且可能还有实现原因。