5.1.5 语法符号
无论是在语法的产生中还是在整个本规范中,只要文本直接引用这样的终止符号,词法、正则和数字字符串语法的终止符号以固定宽度字体显示。 这些是出现在一个脚本完全按照书面。 以这种方式指定的所有终止符号代码点将被理解为来自基本拉丁语范围的适当的Unicode 代码点,而不是来自其他 Unicode 范围的任何类似外观的代码点。
非终止符号以斜体类型显示。非终结符(也称为“生产”)的定义由定义的非终止符的名称引入,后面跟着一个或多个冒号。(冒号数指示生产属于哪种语法)。非终止符的一个或多个可选右侧随后跟随在后续行。例如,句法定义:
WhileStatement:
while (Expression) Statement
表示非终止的 WhileStatement 表示 token while,后跟左括号标记,后跟表达式,后跟右括号标记,后跟语句。 表达式和语句的出现本身是非终止符。 作为另一个例子,句法定义:
ArgumentList:
AssignmentExpression
AssignmentExpression
说明 ArgumentList 可以表示单个 AssignmentExpression 或 ArgumentList,后面跟逗号,后跟一个 AssignmentExpression。 这个ArgumentList 的定义是递归的,也就是说,它是根据自身定义的。 结果是 ArgumentList 可以包含任何正数的参数,用逗号分隔,其中每个参数表达式是一个 AssignmentExpression。 非终结符的这种递归定义是常见的。
下标后缀“opt”可以出现在终端或非终端之后,表示可选符号。 包含可选符号的替代实际上指定了两个右侧,一个省略可选元素,另一个省略可选元素。 这意味着:
VariableDeclaration:
BindingIdentifier Initializeropt
以下是一个方便的缩写:
VariableDeclaration:
BindingIdentifier
BindingIdentifierInitializer
然后:
IterationStatement:
for(LexicalDeclaration Expressionopt ; Expressionopt)Statement
其又是以下的缩写:
IterationStatement:
for(LexicalDeclaration;)Statement
for(LexicalDeclaration;Expression)Statement
for(LexicalDeclarationExpression;)Statement
for(LexicalDeclarationExpression;Expression)Statement
因此,在这个例子中,非终止 IterationStatement 实际上有四个可选右侧。
生产可以通过形式“[parameters]”的下标注释来参数化,其可以作为由生产定义的非终止符号的后缀。 “参数”可以是单个名称或逗号分隔的名称列表。 参数化生产是定义参数名称的所有组合的一组生成的缩写,前缀是附加到参数化非终止符号的下划线。 这意味着:
StatementList[Return]:
ReturnStatement
ExpressionStatement
以下一个方便的缩写:
StatementList:
ReturnStatement
ExpressionStatement
StatementList_Return:
ReturnStatement
ExpressionStatement
然后:
StatementList[Return, In]:
ReturnStatement
ExpressionStatement
是以下的缩写形式:
StatementList:
ReturnStatement
ExpressionStatement
StatementList_Return:
ReturnStatement
ExpressionStatement
StatementList_In:
ReturnStatement
ExpressionStatement
StatementList_Return_In:
ReturnStatement
ExpressionStatement
多个参数产生组合数目的生成,不是所有的参数都必须在完整语法中引用。
还可以参考生产的右侧的非终止符。 例如:
StatementList:
ReturnStatement
ExpressionStatement
等价于:
StatementList:
ReturnStatement
ExpressionStatement_In
和:
StatementList:
ReturnStatement
ExpressionStatement
等价于:
StatementList:
ReturnStatement
ExpressionStatement
非终止引用可以具有参数列表和“opt”后缀。 例如:
VariableDeclaration:
BindingIdentifierInitializer[+In]opt
缩写形式:
VariableDeclaration:
BindingIdentifier
BindingIdentifier Initializer_In
在右侧非终结引用上用“?”前缀参数名称使得该参数值取决于参考当前生产的左侧符号的引用的出现。 例如:
VariableDeclaration[In]:
BindingIdentifier Initializer[?In]
缩写形式:
VariableDeclaration:
BindingIdentifier Initializer
VariableDeclaration_In:
BindingIdentifier Initializer_In
如果右侧替换选项以“[+ parameter]”为前缀,那么仅当使用命名参数引用生产的非终结符号时,该替代选项才可用。 如果右侧选项以“[〜parameter]”作为前缀,那么只有在引用生产的非终止符号时未使用命名参数时,该替代选项才可用。 这意味着:
StatementList[Return]:
[+Return]ReturnStatement
ExpressionStatement
缩写形式:
StatementList:
ExpressionStatement
StatementList_Return:
ReturnStatement
ExpressionStatement
和:
StatementList[Return]:
[~Return]ReturnStatement
ExpressionStatement
缩写形式:
StatementList:
ReturnStatement
ExpressionStatement
StatementList_Return:
ExpressionStatement
当单词“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]” 出现在生产的右侧,则表示如果紧接着的输入令牌序列是给定集合的成员,则可以不使用生产。 该集合可以写成用大括号括起来的一个或两个元素末端序列的逗号分隔列表。 为了方便起见,集合也可以写为非终结符,在这种情况下,它表示该非终结符可以扩展到的所有终端的集合。 如果集合由单个终端组成,则可以使用短语 “[lookahead≠terminal]”。
例如,给出如下定义:
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后跟一个或多个十进制数字,其中第一个为偶数,或十进制数字后面不跟另一个十进制数字。
如果在语法语法生成的右侧出现短语“在此处没有行终止符”,则表示生产是受限制的生产:如果 LineTerminator 发生在输入流中,则不能使用 指示位置。 例如,生产:
ThrowStatement:
throw [no LineTerminator here] Expression ;
表示如果 LineTerminator 发生在throw token 和 Expression 之间的脚本中,则可能不会使用生产。
除非 LineTerminator 的存在被受限制的生产禁止,否则任何数量的 LineTerminator 可能出现在输入元素流中的任何两个连续的令牌之间,而不影响脚本的句法可接受性。
当词法语法或数字串语法的生产中的替代方案看起来是多代码点 token 时,其表示将构成这样的 token 的代码点的序列。
生产的右侧可以指定不允许通过使用短语“但不是”然后指示要排除的扩展的某些扩展。 例如,生产:
Identifier::
IdentifierName but not ReservedWord
意味着非终止标识符可以由可以替换标识符名称的任何码点序列代替,只要相同的码点序列不能替换保留字。
最后,在列出所有替代方案不切实际的情况下,通过无衬线类型的描述性短语描述几个非终止符号:
SourceCharacter::
any Unicode code point