本章介绍此规范中使用的无上下文语法,用于定义程序的词汇和句法结构。
2.1. 无上下文语法
无上下文的语法由许多作品组成。每个生产有一个抽象符号称为非终端作为它的左侧,和一个序列的一个或多个非终端和终端符号作为它的右侧。对于每个语法,终端符号都是从指定的字母表中绘制的。
从由单个可分辨的非终端(称为目标符号)组成的句子开始,给定的无上下文语法指定一种语言,即一组可能序列的终端符号,这些序列可以通过重复替换序列中的任何非终端,而非终端是左侧的生产右侧。
2.2. 词汇语法
Java编程语言的词汇语法在§3中给出(词汇结构)。此语法的终端符号是 Unicode 字符集的字符。它定义一组生产,从目标符号Input (§3.5) 开始,用于描述 Unicode 字符序列 (§3.1) 如何转换为输入元素序列(§3.5)。
这些输入元素(空白(§3.6)和注释 (§3.7)被丢弃)构成了 Java 编程语言语法的终端符号,称为标记(§3.5)。这些标记是 Java 编程语言的标识符 (§3.8)、关键字 (§3.9)、文本 (§3.10)、分隔符 (§3.11) 和运算符 (§3.12)。
2.3. 句法语法
Java编程语言的句法语法在第 4、6-10、14 和 15 章中给出。此语法具有由词汇语法定义的标记作为其终端符号。它定义了一组生产,从目标符号编译单元(§7.3) 开始,描述令牌序列如何形成语法正确的程序。
为方便起见,语法语法在第19章中一起提出。
2.4. 语法符号
终端符号在词汇和句法语法的制作中以字体显示,并且在整个规范中,每当文本直接引用此类终端符号时。这些将完全按照写入程序显示在程序中。fixed width
非终端符号以通体类型显示。非终端的定义由所定义的非终端的名称引入,后跟冒号。一个或多个非终端的替代定义,然后遵循后续行。
例如,句法生产:
如果陈述:if
(
表达式语句)
声明非终端ifThenState 表示令牌,后跟左括号标记,后跟表达式,后跟右括号标记,后跟语句。if
生产右侧的语法 [x]表示 x 的零个或多个出现。
例如,句法生产:
参数列表:
参数 [, 参数]
指出参数列表由参数组成,后跟逗号和参数的零个或多个匹配项。结果是,参数列表可能包含任何正数的参数。
生产右侧的语法 [x]表示 x 的零或一次出现。也就是说,x 是一个可选的符号。包含可选符号的替代项实际上定义了两个备选方法:一个省略可选符号,另一个包含它。
这意味着:
中断声明:break
[识别器];
是方便的缩写:
中断声明:break
;
break
标识符;
另一个例子,它意味着:
基本声明:for
(
[前] [表达式] [上一个日期] 声明;``;``)
是方便的缩写:
基本声明:for
(
;
[表达式] [上一个日期] 语句
forInit [表达式] [ForUpdate] 语句;``)``for``(``;``;``)
反过来,它又是以下缩写:
基本声明:for
(
;
;
[上一个日期] 语句
表达式 [ForUpdate]
语句 forInit [ForUpdate]
语句 forInit 表达式 [ForUpdate] 语句)``for``(``;``;``)``for``(``;``;``)``for``(``;``;``)
反过来,它又是以下缩写:
基本声明:for
(
;
;
)
语句
forUpdate
语句
表达式 forUpdate
语句 forInit 语句
forInit
forInit
ForInit 语句 forInit 表达式 forInit 表达式 forUpdate 语句for``(``;``;``)``for``(``;``;``)``for``(``;``;``)``for``(``;``;``)``for``(``;``;``)``for``(``;``;``)``for``(``;``;``)
so the nonterminal BasicForStatement actually has eight alternative right-hand sides.
A very long right-hand side may be continued on a second line by clearly indenting the second line.
For example, the syntactic grammar contains this production:
NormalClassDeclaration:
{ClassModifier} Identifier [TypeParameters] [Superclass] [Superinterfaces] ClassBodyclass
which defines one right-hand side for the nonterminal NormalClassDeclaration.
The phrase (one of) on the right-hand side of a production signifies that each of the terminal symbols on the following line or lines is an alternative definition.
For example, the lexical grammar contains the production:
ZeroToThree:
(one of)0 1 2 3
which is merely a convenient abbreviation for:
ZeroToThree:0
1
2
3
When an alternative in a production appears to be a token, it represents the sequence of characters that would make up such a token.
Thus, the production:
BooleanLiteral:
(one of)true
false
is shorthand for:
BooleanLiteral:t r u e
f a l s e
The right-hand side of a production may specify that certain expansions are not permitted by using the phrase “but not” and then indicating the expansions to be excluded.
For example:
Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
Finally, a few nonterminals are defined by a narrative phrase in roman type where it would be impractical to list all the alternatives.
For example:
RawInputCharacter:
any Unicode character
Prev | Next | |
---|---|---|
Chapter 1. Introduction | Home | Chapter 3. Lexical Structure |