May 26, 2007

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

5.1 语法和词法文法

这一节描述了本规范中使用的上下文无关文法,这是 ECMAScript 程序语法结构的定义。

5.1.1 上下文无关文法(Context-Free Grammars)

一个上下文无关文法由许多产生式(productions)组 成。每个产生式都拥有一个抽象符号作为其左式(left-hand side),被称为非终结 符(nonterminal),以及一个由零个或多个非终结符和终结符(terminal)组 成的右式(right-hand side)。对于每个文法而言,终结符是从一个特定的字母表中抽取的。

句子的开始由单个显式的非终结符组成,被称为目标符(goal symbol),一个给定的上 下文无关文法规定了这样一种语言,它被表示为可能的终结符序列组成的集合(有可能是无限集),这是用产生式左式重 复替换序列中一切非终结符得到的,替换时所用的产生式的左式要和被替换的非终结符一致。

5.1.2 词法文法和正则表达式文法

ECMAScript 的词法文法(lexical grammar)在条款7中 给出。此文法 以 Unicode 字符集中的字符作为其终结符。它定义了一个产生式集合,其中的产生式以目标符输入分隔元素 (InputElementDiv)输入正则表达式元素(InputElementRegExp)开 始,这描述了 Unicode 字符是如何被翻译成输入元素序列的。

为 ECMAScript 语法文法提供的除空白和注释之外的输入元素被称为 ECMAScript 托肯 (token)。这些托肯即 ECMAScript 语言中的保留字、标识符、常量和标点符号。此外,行结束符即使不被认为是托肯,它同样是输入的元素流中的一部分,并指导自动插入分号的过程 (7.8.5)。普通的空白和单行注释被丢弃,且不出现在为语法文法提供的输入元素流中。对于多 行注释 (MultiLineComment)(即形如 "/*...*/"的注释,不论它跨越了多少行),如果它没有包含行结束符,就被简单地丢弃;假使多行注释包含一 个以上行结束符,则用单个行结束符替换它,使之成为为语法文法提供的输入元素流的一部分。

ECMAScript 的正则表达式文法(RegExp grammar)15.10 中给出。此文法同样 以 Unicode 字符集中的字符作为其终结符。它定义了一个产生式集合,其中的产生式以目标符的模式(Pattern)为 起始,描述了 Unicode 字符是如何被翻译成正则表达式模式的。

词法文法和正则表达式文法的产生式被识别为被两个冒号"::"分割的产生式。词法文法和正则表达式文法共享某些产生式。

5.1.3 数字化字符串文法

第二个文法被用于将字符串翻译为数值量。此文法类似词法文法中与数字常量有关的部分, 以 Unicode 字符集中的字符作为其终结符。此文法在9.3.1中出现。数字化字符串文法的产生式被识 别为被三个冒号":::"分割的产生式。

5.1.4 语法文法

ECMAScript 的语法文法在条款11121314中 给出。此文法以词法文法定义的 ECMAScript 托肯作为其终结符(5.1.2)。它定义了一个产生式 集合,其中的产生式以目标符 Program 开始,描述了托肯序列是如何构成语法正确的 ECMAScript 程序的。

若将一个 Unicode 字符流被解析为一个 ECMAScript 程序,首先,通过重复应用词法文法,它被转化为一个输入元素流;通过一次应用语法文法,这个输入元素流继续被解析。如果输入元素流中已不再留有托肯,而托肯仍无法被解析为单个目标非终结符 Program,则这个程序语法出错。

语法文法的产生式被识别为仅被一个冒号":"分割的产生式。

语 法文法被表示为0,0,0的分段,0其实不是能被正确的 ECMAScript 程序接受的托肯序列中的一员。确定的额外托肯序列同样会被接受,也就是说,即使只有冒号被加入序列中的某个位置(比如在行结束字符之前),这些托肯也会被 文法所描述。深入说来,即便终结字符出现在某些“尴尬”的位置上,被文法描述的、确定的托肯序列也不考虑其是否能被接受。


//全文太长,先发的这部分是说明部分
//最后一段没看懂,晕

1 comment:

氷の鋭 said...

5.1.4节最后一段首句被认为是原文出错,现译为"语法文法在章节11,12,13,14中体现,它事实上不是能被正确的 ECMAScript 程序接受的托肯序列中的一员。"