文法标记法

2018-06-16 14:05 更新

词法文法和字符串文法的终结符,以及一些语法文法的终结符,无论是在文法的产生式还是贯穿本规范的所有文本直接给出的终结符,都用 等宽 (fixed width) 字体显示。他们表示程序书写正确。所有以这种方式指定的终结符字符,可以理解为 Unicode 字符的完整的 ASCII 范围,不是任何其他类似的 Unicode 范围字符。


非终结符以 斜体 (italic) 显示。一个非终结符的定义由非终结符名称和其后定义的一个或多个冒号给出。(冒号的数量表示产生式所属的文法。)非终结符的右侧有一个或多个替代子紧跟在下一行。 例如,语法定义:

WhileStatement
while ( Expression ) Statement


表示这个非终结符 WhileStatement 代表 while token,其后跟左括号 token,其后跟 Expression,其后跟右括号 token,其后跟 Statement。这里出现的 Expression 和 Statement 本身是非终结符。另一个例子,语法定义:

ArgumentList : 
AssignmentExpression 
ArgumentList , AssignmentExpression

表示这个 ArgumentList 可以代表一个 AssignmentExpression,或 ArgumentList,其后跟一个逗号,其后跟一个 AssignmentExpression。这个 ArgumentList 的定义是递归的,也就是说,它定义它自身。其结果是,一个 ArgumentList 可能包含用逗号隔开的任意正数个参数,每个参数表达式是一个 AssignmentExpression。这样,非终结符共用了递归的定义。


终结符或非终结符可能会出现后缀下标“ opt ”,表示它是可选符号。实际上包含可选符号的替代子包含两个右边,一个是省略可选元素的,另一个是包含可选元素的。这意味着:


VariableDeclaration : 
Identifier Initialiseropt

是以下的一种缩写:


VariableDeclaration : 
Identifier 
Identifier Initialiser

并且:


IterationStatement : 
for ( ExpressionNoInopt ; Expressionopt ; Expressionopt ) Statement

是以下的一种缩写:


IterationStatement :
for ( ; Expressionopt ; Expressionopt ) Statement 
for ( ExpressionNoIn ; Expressionopt ; Expressionopt ) Statement

是以下的一种缩写 :


IterationStatement : 
for ( ; ; Expressionopt ) Statement 
for ( ; Expression ; Expressionopt) Statement 
for ( ExpressionNoIn ; ; Expressionopt) Statement 
for ( ExpressionNoIn ; Expression ; Expressionopt) 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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号