Java语言规范(Java SE 22)章2 语法

本章描述了本规范中用于定义程序的词汇和句法结构的上下文无关语法。

2.1 上下文无关文法

语境自由语法由多个产生式组成。每个产生式左边有一个称为非终结符的抽象符号,右边是一个或多个非终结符和终结符的序列。对于每个语法,终结符是从指定的字母表中抽取的。

从由一个称为目标符号的单个可区分的非终结符组成的句子开始,给定的上下文无关语法指定一种语言,即一组可能的终结符序列,该序列可以通过将序列中的任何非终结符反复替换为该非终结符为左边的产生式的右边而产生。

如上两段话比较难以理解,此处给出一个简单的示例进行解释:

加入所有的大写英文字母均为非终结符,所有的小写字母为终结符,并存在如下生成式:

S - cAd        A - Be        B - cd

计算目标符号S的方式如下

1、通过A的生成式,可以得到 S - cBed

2、通过B的生成式,可以得到 S - ccded

通过如上方式,把所有的非终结符替换为对应的终结符得到目标符号的最终表示。

2.2 词汇语法

Java编程语言的词汇语法在第3章中(词汇结构)介绍。该语法以 Unicode 字符集的字符作为其终端符号。它定义了一组产生式,从目标符号 Input(第 3.5 节)开始,描述如何将 Unicode 字符序列(第 3.1 节)转换为输入元素序列(第 3.2 节)。

这些输入元素,加上被丢弃的空白(第 3.6 节)和注释(第 3.7 节),构成了 Java 编程语言句法语法的终端符号,称为标记(tokens)(第 3.5 节)。这些标记是 Java 编程语言的标识符(第 3.8 节)、关键字(第 3.9 节)、字面值(第 3.10 节)、分隔符(第 3.11 节)和运算符(第 3.12 节)。

2.3 句法语法

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

为方便起见,句法语法在第 19 章中一并介绍。

2.4 语法符号

在词法和句法语法的产生式中,终端符号以固定宽度的字体显示,并且在本规范中,只要文本直接引用这样的终端符号,这些符号就会出现在程序中,就像写的那样。

非终结符以斜体显示。非终结符的定义由所定义的非终结符的名称引入,然后是冒号。然后在后续行中为非终结符定义一个或多个替代定义。

注:在本文中,将以正体作为终端符,斜体加粗作为非终端符。

例如,如下语法生成式:

 IfThenStatement:

        if (Expression) Statement

非终结式 IfThenStatement 表示标记符 if,后面跟着(标记符,后面跟着非终结符Expression,后面跟着)标记符,后面跟着 Statement

产生式右侧的语法 {x} 表示 x 的出现次数为零次或多次。例如,如下语法生成式:

ArgumentList:

        Argument {, Argument}

表示ArgumentList包含一个Argument,其后可以跟零或多个逗号及Argument,最终的结果就是ArgumentList包含一个以上Argument

产生式右侧的语法 [x] 表示 x 的出现次数为 0 或 1。也就是说,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其实是有8种右侧表达式。

一个非常长的右侧可以通过在第二行中清晰地缩进第二行来继续。

例如,包含如下生成式的句法语法:

NormalClassDeclaration:

        {ClassModifier} class TypeIdentifier [TypeParameters] [ClassExtends]                 [ClassImplements] [ClassPermits] ClassBody

定义了非终结符NormalClassDeclaration的右侧。

产生式右侧的短语 (one of) 意味着下一行或下一行中的每个符号都是一个替代定义。

例如,包含如下生成式的词法语法:

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 ReservedKeyword or BooleanLiteral

                or NullLiteral

最后,对于列出所有替代方案不太实际的情况下,一些非终结符由罗马字的叙述短语定义。

如:

RawInputCharacter:

        any Unicode character

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值