Wolonge.com 卧龙阁网 企业点评的网站 发现你注定的不平凡
ecma词法分析,笔记为主
上下文无关语法:
一个上下文无关文法 由一定数量的 产生式 (productions) 组成。每个产生式的 左边 (left-hand side) 是一个被称为非终结符 (nonterminal) 的抽象符号, 右边 (right-hand side) 是零或多个非终结符和 终结符 (terminal symbols) 的有序排列。任何文法,它的终结符都来自指定的字母集。
当从一个叫做 目标符 (goal symbol) 的特殊非终端符组成的句子起始,那么给出的上下文无关文法就
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示 语言 (language),即,将产生式右边序列的非终结符当作左边,进行反复替换的结果就成为可能的终结符序列集合(可能无限)。
换句话说,上下文无关语法就是有一定的产生式通过组合而成,组合的形式包括赋值、比较、定
义等等。在每个产生式的左侧是由一个非终结符组成,右边由0到多个非终结符和终结符组成。所谓终结符就是语言中的基本元素,也就是不能再进行分割的定义的最基本单位。非终结符则是由一个或多个终结符与非终结符组成的。对于每一个语法,终结符都来自一个特定的字母表(alphabet)。
词法文法和字符串文法的终结符,以及一些语法文法的终结符,无论是在文法的产生式还是贯穿本
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
的所有文本直接给出的终结符,都用 等宽 (fixed width) 字体显示。他们表示程序书写正确。所有以这种方式指定的终结符字符,可以理解为 Unicode 字符的完整的 ASCII 范围,不是任何其他类似的 Unicode 范围字符。
目标符是指一个构成语言的起始符号,也就是说,在这个基础上(以目标符作为开始或结束),产生式右边的非终结符可以作为左边进行分解。其实就是说按照文法通过其对文法的约定(词法规则)来定义了一种语言。
词法和正则、数字字符串、语法、JSON、文法
空白和注释之外的输入元素构成 ECMAScript 语法文法的终结符,它们被称为 ECMAScript 的 tokens。空白和单行或不含行结束符的多行注释都会被抛弃,而包含的会被替换为一个行结束符。只用一个冒号“:”作为分隔符分割语法词法的产生式。
两个冒号“::”作为分隔符分割词法和正则的文法产生式。词法和正则的文法共享某些产生式。三个冒号“:::”作为分隔符分割数字字符串文法的产生式。两个冒号“::”作为分隔符分割 JSON 词法文法的产生式。JSON 语法文法产生式被一个冒号“:”作为分隔符分割。
文法标记笔记
词法文法和字符串文法的终结符,以及一些语法文法的终结符,无论是在文法的产生式还是贯穿本规范的所有文本直接给出的终结符,都用 等宽 (fixed width) 字体显示。他们表示程序书写正确。所有以这种方式指定的终结符字符,可以理解为 Unicode 字符的完整的 ASCII 范围,不是任何其他类似的 Unicode 范围字符。
非终结符以 斜体 (italic) 显示。一个非终结符的定义由非终结符名称和其后定义的一个或多个冒号给出。(冒号的数量表示产生式所属的文法。)非终结符的右侧有一个或多个替代子紧跟在下一行。
也就是说,每个斜体的定义都可以由数个非斜体的定义取代,这就是非终结符与终结符的区别。
WhileStatement
while ( Expression ) Statement
表示这个非终结符 WhileStatement 代表 while token,其后跟左括号 token,其后跟 Expression,其后跟右括号 token,其后跟 Statement。这里出现的 Expression 和 Statement 本身是非终结符。
换句话说,如同while、if、return、null、(之类的元字符在ecma中就被定义为终结符,而WhileStatement这样的非终结符都是有终结符和非终结符组合而成的。再比如:
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
表示这个 ArgumentList 可以代表一个 AssignmentExpression,或 ArgumentList,其后跟一个逗号,其后跟一个 AssignmentExpression。这个 ArgumentList 的定义是递归的,也就是说,它定义它自身。其结果是,一个 ArgumentList 可能包含用逗号隔开的任意正数个参数,每个参数表达式是一个 AssignmentExpression。这样,非终结符共用了递归的定义。
终结符或非终结符可能会出现后缀下标“ opt ”,表示它是可选符号。实际上包含可选符号的替代子包含两个右边,一个是省略可选元素的,另一个是包含可选元素的。这意味着:
VariableDeclaration :
Identifier Initialiser opt
是以下的一种缩写:
VariableDeclaration :
Identifier
Identifier Initialiser
并且:
IterationStatement :
for ( ExpressionNoIn opt ; Expression opt ; Expression opt ) Statement
是以下的一种缩写:
IterationStatement :
for ( ; Expression opt ; Expression opt ) Statement
for ( ExpressionNoIn ; Expression opt ; Expression opt ) Statement
是以下的一种缩写 :
IterationStatement :
for ( ; ; Expression opt ) Statement
for ( ; Expression ; Expression opt) Statement
for ( ExpressionNoIn ; ; Expression opt) Statement
for ( ExpressionNoIn ; Expression ; Expression opt) Statement
是以下的一种缩写:
IterationStatement :
for ( ; ; ) Statement
for ( ; ; Expression ) Statement
for ( ; Expression ; ) Statement
for ( ; Expression ; Expression ) Statement
for ( ExpressionNoIn ; ; ) Statement
for ( ExpressionNoIn ; ; Expression ) Statement
for ( ExpressionNoIn ; Expression ; ) Statement
for ( ExpressionNoIn ; Expression ; Expression ) Statement
因此,非终结 IterationStatement 实际上有 8 个右侧变体。
如果文法定义的冒号后面出现文字“one of”,那么其后一行或多行出现的每个终结符都是一个选择定义。例如,ECMAScript 包含的词法文法生产器:
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
这仅仅下面写法的一种缩写:
NonZeroDigit ::
1
2
3
4
5
6
7
8
9
如果产生式的右侧是出现“[empty]”,它表明,产生式的右侧不包含终结符或非终结符。
如果产生式的右侧出现“[lookahead ∉ set]”,它表明,给定 set 的成员不得成为产生式紧随其后的 token。这个 set 可以写成一个大括号括起来的终结符列表。为方便起见,set 也可以写成一个非终结符,在这种情况下,它代表了这个非终结符 set 可扩展所有终结符。例如,给出定义
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
在定义
LookaheadExample ::
n [lookahead ∉ {1 , 3 , 5 , 7 , 9}]DecimalDigits
DecimalDigit [lookahead ∉ DecimalDigit ]
能匹配字母 n 后跟随由偶数起始的一个或多个十进制数字,或一个十进制数字后面跟随一个非十进制数字。
如果产生式的右侧出现“[no LineTerminator here]”,那么它表示此产生式是个受限的产生式:如果 LineTerminator 在输入流的指定位置出现,那么此产生式将不会被适用。例如,产生式:
ThrowStatement :
throw [no LineTerminator here] Expression ;
表示如果程序中 return token 和 Expression 之间的出现 LineTerminator,那么不得使用此产生式。
LineTerminator 除了禁止出现在受限的产生式,可以在输入元素流的任何两个 tokens 之间出现任意次数,而不会影响程序的语法验证。
当一个词法文法产生式或数字字符串文法中出现多字符 token,它表示此字符序列将注册一个 token。
使用词组“but not“可以指定某些不允许在产生式右侧的扩展,它说明排除这个扩展。例如,产生式:
Identifier ::
IdentifierName but not ReservedWord
此非终结符 Identifier 可以由可替换成 IdentifierName 的字符序列替换,相同的字符序列不能替换 ReservedWord。
最后,对于实际上不可能列出全部可变元的少量非终结符,我们用普通字体写出描述性的短语来描述它们:
SourceCharacter ::
any Unicode code unit
Wolonge.com 卧龙阁网 企业点评的网站 发现你注定的不平凡