May 26, 2007

ECMA-262试译:5.1 Syntatic and Lexical Grammars(下)

5.1.5 文法记法

词法和字符串文法的终结符,以及有些语法文法的终结符,将以等宽(fixed width)字 体显示在文法的 产生式中,贯穿本规范中该文本被直接引用为一个终结符 的全过程。它们可出现在写成的程序中。所有的非终结字符以这种特定的方式,作为恰当的、ASCII 范围内的 Unicode 字符被识别,以区别其它 Unicode 范围内看上去相似的 Unicode 字符。

非终结符以斜体(italic)显示。非终结符的定义由其被定义的名字后跟一个或更多冒号引入 (冒 号的数量指出产生式所属的文法)。非终结符中一个或多个可变的右式紧跟在下一行。例如,文法语法的定义:

With语句 :

with ( 表达式 ) 语句

这说明非终结符With语句表示 with 托肯,后跟一个左括号托肯,再跟随一个表达式,其后是一个右括号托肯,再后面是一个语句。 出现的表达式语句它们自身都是非终结符。作为另一个例子,有文法定义:

参数列表 :

赋值表达式
参数列表 , 赋值表达式

这说明一个参数列表可以表现为单个赋值表达式,或一个参 数列表后跟一个逗号,再跟一个赋值表达式参数列表的 定义是递归的(recursive),也就是说,它的定义中借用了它本身。结果是参数列表可 以包含任意数量为正的参数,以逗号隔开,每个参数表达式都是一个赋值表达式。像这样的非终结符的递归定义很常见。

出现在终结符或非终结符后面的下标后缀"opt",指出这是一个可选符号(optional symbol)。 包含可选符号的可变部分其实可以细分为两个右式,其一忽略可选元素,而另一个包括它。这意味着:

变量声明 :

标识符 初始化器opt

是下述产生式的简略形式:

变量声明 :

标识符
标识符 初始化器

再如:

迭代语句 :

for ( 入口表达 式opt ; 表 达式opt ; 表 达式opt) 语 句

是下述产生式的简略形式:

迭代语句 :

for ( ; 表达式opt ; 表达式opt)
for ( 入口表达式 ; 表达式opt ; 表达式opt) 语句

它是由下面的产生式的简略形式转变得到的:

迭代语句 :

for ( ; ; 表达式opt) 语句
for ( ; 表达式 ; 表达式opt) 语句
for ( 入口表达式 ; ; 表达式opt) 语句
for ( 入口表达式 ; 表达式 ; 表 达式opt) 语 句

它是由下面的产生式的简略形式转变得到的:

迭代语句 :

for ( ; ; ) 语句
for ( ; ; 表达式 ) 语 句
for ( ; 表达式 ; ) 语 句
for ( ; 表达式 ; 表达式 ) 语句
for ( 入口表达式 ; ; ) 语 句
for ( 入口表达式 ; ; 表达式 ) 语句
for ( 入口表达式 ; 表达式 ; ) 语句
for ( 入口表达式 ; 表达式 ; 表 达式 ) 语句

所以说,迭代语句其实有八个可变右式。

如果产生式右式出现了短语"[lookahead ∉ set]",指的是如果紧接着的输入终结符不是所给集合 set 的 成员,则不使用此产生式。 集合 set 可以被写成克里闭包中的非闭合终结符组成的列表。为方便起见,这个集合也可写成一个非终结符,这使它代表除去此非终结符的所有终结符构成的集合。例如,给 出下列定义:

十进制数字 :: one of

0 1 2 3 4 5 6 7 8 9

十进制数 ::

十进制数字
十进制数 十进制数字

定义

Lookahead示例 ::

n [lookahead ∉ {1,3,5,7,9}] 十进制数
十进制数字 [lookahead ∉ 十 进制数]

当字母 n 后跟一个或多个首位是偶数的十进制数,或后跟一个后面没有另一个十进制数字的数字时,完成匹配。

如果语法文法的产生式右式出现了短语"[no LineTerminator here]",它指出了该产生式是一个受约束产生式(restricted production): 如果行结束符出现在输入流的指定位置上,这个产生式不被使用。例如,下面的产生式:

返回语句 :

return [no LineTerminator here] 表达式opt ;

这里指出了,如果在 return 托肯和 表达式 之间出现了行结束符,则不使用此产生式。

直到出现的行结束符被受限产生式禁止之前,在输入的元素流中,行结束符允 许在两个连续托肯之间出现任意次数但对程序的语法可接受性没有影响。

如果在语法定义的冒号之后出现了单词"one of",它表示随后的行中的所有终结符被当 作一个可变定义。例如,在 ECMAScript 的词法文法中包含下面的产生式:

非零数字 :: one of

1 2 3 4 5 6 7 8 9

这只不过是下面的产生式的简略形式:

非零数字 ::

1
2
3
4
5
6
7
8
9

当词法文法或数字化字符串文法的产生式可变部分中出现了多字符托肯,表示这个字符序列构成一个托肯。

使用短语"but not"可具体指明产生式的某些特定扩充是不允许的,这样可以把指定的 扩充排除在外。例如,下面的产生式:

标识符 ::

标识符名 but not 保 留字

意思是,非终结符标识符可以被任意可以替换标识符名的 字符序列替换,同一序列不能被保留字替换。

最后,对于实际上不可能列出全部可变元的少量非终结符,我们用普通字体写出描述性的短语来描述它们:

源文件字符 ::

任何 Unicode 字符


①原书此处有 one of,错误。

No comments: