ECMA262 记法约定
写在最前面的话:
首先,这将是一个系列的帖子.其次,你进来了,我很不幸的告诉你,这是一个坑,因为我不知道什么时候能放出下一章.管挖不管埋啊.
读ECMA262.第五章-记法约定,有必要先读一下,才好在阅读其他章节的时候.更容易明白,类似Program 和 Program .同样一个词指的东西完全不同,从而更好的进行阅读.所以先搞出这章放着吧.
这部分是平时业余时间翻译出来的,水平有限.难免有错漏的地方.欢迎指正.另外winter 和 hax,两个站着说话,不腰疼的家伙.的意思是.Edition3 out了. 应该搞Edition5.但我坚持以现行标准为主.遇到Edition5有不同,或增加的段子.就标红注释.所以就成了现在这个样子. 还一个最重要的原因就是Edition5内容真的好多.
记法约定(Notational Conventions)
语法和词法文法(Syntactic and Lexical Grammars)
本章节描述了ECMAScript程序,所使用的上下文无关文法(context-free grammars,即2型文法)是如何定义相关词法和语法结构规范的.
上下文无关文法(Context-Free Grammars)
由0个或多个非终结符以及终结符组成的序列,构成其右式(right-hand side).对于每个文法来说,终结符都是从一个其规定的字母表中筛选出来的.(注1)
从一个,由被称为目标符号(goal symbol symbo)的,作为应用文法起始特征的,非终结符构成的句子开始,一个
上下文无关文法,是通过那些可能导致,反复的根据其规则进行左式非终结符与右式的,
(可能是无限的)
来定义一种语言的.(这里其实就是想说,2型文法通过其约定的产生式,(即词法规则)来定义一种语言)
词法和正则表达式文法(The Lexical and RegExp Grammars)
ECMAScript所给定的词法文法参见第7章.该文法以Unicode字符集作为基础,从中定义了其终结符. 并定义了一些产生式,这些产生式定义了,从目标符除法符号或正则表达式符开始(指:/),
Unicode字符集序列是如何被解析成输入元素序列的.
ECMAScript的语法文法的终结符中,输入元素是区别于空白和注释的.这些输入元素被称为ECMAScript的标记(记号-tokens).这些标记包括ECMAScript所定义并使用的,保留字、标识符、直接量、
以及
标点符号.另外,行终结符虽然不被认为是一种标记(token).但却被认为是输入元素的一部分.并专门辅助用来实现分号自动插入机制的(参见 7.9.5章节). 一般的空白(\u3000也算)和单行注释,
将会被忽略,即不会出现在语法文法的输入元素流(stream of input elements)中.而多行注释(/*...*/这种内部无行终结符的东东),也同样会被简单的忽略掉.但如果是一个内部存在一个或多个
行终结符的
多行注释,则会被替换为一个单独的行终结符
(注2)
.并成为语法文法输入元素流的一部分.
ECMAScript的正则表达式文法相关内容,参见15.10章节. 该文法所指定的终结符,同样筛选自Unicode字符集.该文法同样定义的那些产生式,定义了,如何从一个目标符模式开始,把这些字符序列
解析成正则表达式模式的.
词法产生式,和正则表达式文法产生式,都有用于分隔作用的两个冒号"::"作为其特征.词法和正则表达式文法还具有(使用,共享)一些相同的产生式.
数字和字符串文法(The Numeric String Grammar)
一个用于把字符串解释成对应的数字值的文法.此文法和词法文法中关于数字直接量的部分类似.并把这些数字字符串作为终结符的源字符. 参见9.3.1章节.
数字型字符串的文法产生式,用三个冒号":::",作为其产生式的特征.
语法文法(The Syntactic Grammar)
11、12、13、14章,具体描述了ECMAScript的语法文法.此文法包括词法文法所定义的,属于终结符的ECMAScript标记(tokens)(参见5.1.2章节).并定义了从程序的目标符开始的,一些产生式.
语法文法的产生式,是以一个冒号":"作为特征的.
11,12,13和14章.描述的相关语法文法,其实并不是全部,ECMAScript程序中所允许的token序列.还有一些额外的token是被接受的. 也就是说,在某些地方(比如在行终结符前)插入的分号,就需要被文法所解释.此外,假如一个终结符出现在某些"尴尬"的位置上的时候(我去,啥地方是尴尬的位置?大概是不允许出现终结字符的地方?比如字符串中的一个换行?),这样的token序列就是不被文法所接受的.
Edition5:(此处,为Edition5新增)
Javascript 对象字面量表示-文法(The JSON Grammar)
JSON文法是用于把一个描述了一些ECMAScript 对象的字符串,转化为真正对象的文法.具体参见15.12.1章节.
|
JSON文法包括JSON词法文法和语法文法两部分.其中,词法文法部分,是用于把字符序列转换成tokens的,并且类似于ECMAScript的部分词法文法. JSON语法文法,是用于描述,如何使用,通过词法文法得到的tokens,来组成符合语法的 JSON 对象的.
JSON词法文法产生式,是以两个冒号 "::"作为其特征,以及分隔性的符号.JSON词法文法直接使用了一些ECMAScript词法文法的产生式,作为其产生式. 而JSON语法文法,基本与ECMAScript语法文法的某一部分相类同. JSON语法文法的产生式,是以 一个冒号":",作为其特征以及分隔符号的.
文法表示法(记法,Grammar Notation)
词法和字符串文法的终结符,以及语法文法的终结符,是用等宽字体(fixed width)(注4)显示的.贯穿整个ECMA标准.
两种文法产生式中,只要出
现这种(等宽字体)文字.它都直接表示一个终结符.这些终结符,其实会出现在语言使用者所写的程序中.所有定义的终结符类型的字符,所以要用等宽字体表示,就是为了更好的在ASCII范围内识别那些,被选出的(指被选做终结符的,但属于ASCII范围的字符),以及区别那些Unicode范围内,看起来很相似的那些字符. 非终结符用 (斜体) 表示. 非终结符的定义即是 非终结符名 一个或多个冒号":" 后面的那部分(冒号的数量,则代表其属于哪种文法. 比如前面提到的 语法文法就是用一个冒号 ":"). 一个或多个右式子(产生式的右式)中,可供选择的非终结符,会在后续行中被解释.
例子
: 通过上面这个语法产生式.我们可以看到, 非终结符-WithStatement 代表(冒号 : 后面的部分)这样一种语法,一个 token(终结符) with,后面跟这一个token-左括号 "(",然后是一个非终结符-表达式-Expression,然后是一个token-右括号")",然后是一个 非终结符-Statement(语句).
AssignmentExpression
上面这个语法产生式表示,一个ArgumentList可以代表一个单独的
ArgumentList 可以包含任意数量(正数)的,用逗号","来分隔的 参数. 其中每一个参数表达式,都是一个
AssignmentExpression.这种递归形式的定义,是通用的形式.
关于可能出现在终结符或非终结符后面的,(产生式中的)-opt下标(注5),是一个代表可选择性意义的符号.它实际上,表示了两种右式形式.一种是包含具备可选符号元素.而另一种则没有这个东东.
VariableDeclaration :
Identifier Initialiser-opt
上面这个产生式.也可以写成下面这种形式:
VariableDeclaration :
Identifier
以及
可写成:
for ( ; Expression-opt ; Expression-opt) Statement
ExpressionNoIn
; Expression-opt ; Expression-opt) Statement
(后面还有例子.很蛋疼.这里就不抄了.......)
如果 "[empty]" 作为产生式的右式出现.则表示产生式的右式中,不浩瀚任何终结符和非终结符.
如果
"[lookahead
∉ set
]"
出现在产生式的右式中,它表示紧随的输入记号(input token),不能是给定集合set中的任何一个. set可以写成由一组大括号"{}"所包含的列表. 为了简便,也可以写成一个非终结符的形式.即表示所有这个非终结符所推导出的终结符.属于set集合.