本章介绍了本规范中用于定义程序的词汇和句法结构的上下文无关语法。
上下文无关语法
上下文无关语法由许多产物组成。每个产物的左手边都有一个称为非终止符的抽象符号,而在右手边有一个或多个非终止符和终止符的序列。对于每种语法,终止符号都是从指定的字母中绘制的。
给定的上下文无关语法,从一个由唯一的非终止符组成的句子(称为目标符号)开始,它指定一种语言,即可能由终止符号重复出现的可能的终止符序列组成的集合,该序列可能是通过用产物右边的非终止符替换左边的非终止符。
词汇语法
词法结构给出了Java编程语言的词法语法。该语法的结尾符号是Unicode字符集的字符。它定义了一组产物,从目标符号输入开始,描述了如何将Unicode字符序列转换为输入元素序列。
这些带有空格和注释的输入元素形成Java编程语言的句法语法的终止符号,并称为标记。 这些标记是Java编程语言的标识符,关键字,字面量,分隔符和运算符。
句法语法
Java编程语言的句法语法在后面给出。该语法的末端符号是词汇语法定义的标记。它从目标符号编译单元(CompilationUnit)开始定义了一组产物,描述了标志序列如何形成语法正确的程序。
语法标记
在词汇和句法语法的产物中,以及在整个说明书中,只要文本直接涉及到这样的终止符号,终止符号就会以固定宽度的字体显示。它们应完全按照编写的程序出现在程序中。
非终止符以斜体显示。非终止符的定义由要定义的非终止符的名称引入,后跟冒号。 然后在后续行中遵循非终止符的一个或多个替代定义。
例如,语法产物:
IfThenStatement:
if ( Expression ) Statement
声明非终结符IfThenStatement表示标志if,后跟左括号标志,后跟表达式,然后是右括号标志,然后是语句。
产物右侧的语法{x}表示x的出现次数为零或更多。
例如,语法产物:
ArgumentList:
Argument {, Argument}
声明ArgumentList由Argument组成,后跟零个或多个出现的逗号和Argument。结果是ArgumentList可以包含任意正数的Argument。
产物右侧的语法 [x]表示x出现零次或一次。也就是说,x是可选符号。包含可选符号的替代,实际上定义了两种替代:一种省略了可选符号,另一种包含了可选符号。
这意味着:
BreakStatement:
break [Identifier] ;
是以下内容的简写:
BreakStatement:
break ;
break Identifier ;
再举一个例子,它意味着:
BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
是以下内容的简写:
BasicForStatement:
for ( ; [Expression] ; [ForUpdate] ) Statement
for ( ForInit ; [Expression] ; [ForUpdate] ) Statement
反过来又是以下内容的缩写:
BasicForStatement:
for ( ; ; [ForUpdate] ) Statement
for ( ; Expression ; [ForUpdate] ) Statement
for ( ForInit ; ; [ForUpdate] ) Statement
for ( ForInit ; Expression ; [ForUpdate] ) Statement
反过来又是以下内容的缩写:
BasicForStatement:
for ( ; ; ) Statement
for ( ; ; ForUpdate ) Statement
for ( ; Expression ; ) Statement
for ( ; Expression ; ForUpdate ) Statement
for ( ForInit ; ; ) Statement
for ( ForInit ; ; ForUpdate ) Statement
for ( ForInit ; Expression ; ) Statement
for ( ForInit ; Expression ; ForUpdate ) Statement
因此,实际上非终止符BasicForStatement的右侧具有八个可选项。
可以通过明显缩进第二行来在第二行上延续很长的右侧。
例如,句法语法包含以下产物:
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody
它为非终止符NormalClassDeclaration定义了一个右侧。
产物右侧的短语(其中之一)表示以下一行中的每个符号都是替代定义。
例如,词汇语法包含产物:
ZeroToThree:
(one of)
0 1 2 3
这只是以下内容的缩写:
ZeroToThree:
0
1
2
3
当作品中的替代品似乎是标志时,它表示组成该标志的字符序列。
因此,产物:
BooleanLiteral:
(one of)
true false
是以下内容的简写:
BooleanLiteral:
t r u e
f a l s e
产物的右侧可以通过使用短语“but not”来指定不允许某些扩展,然后指示要排除的扩展。
例如:
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
最后,一些非终止符由罗马式的叙事短语定义,在其中列出所有替代方案是不切实际的。
例如:
RawInputCharacter:
any Unicode character