W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
詞法文法和字符串文法的終結符,以及一些語法文法的終結符,無論是在文法的產(chǎn)生式還是貫穿本規(guī)范的所有文本直接給出的終結符,都用 等寬 (fixed width) 字體顯示。他們表示程序書寫正確。所有以這種方式指定的終結符字符,可以理解為 Unicode 字符的完整的 ASCII 范圍,不是任何其他類似的 Unicode 范圍字符。
非終結符以 斜體 (italic) 顯示。一個非終結符的定義由非終結符名稱和其后定義的一個或多個冒號給出。(冒號的數(shù)量表示產(chǎn)生式所屬的文法。)非終結符的右側(cè)有一個或多個替代子緊跟在下一行。 例如,語法定義:
表示這個非終結符 WhileStatement 代表 while token,其后跟左括號 token,其后跟 Expression,其后跟右括號 token,其后跟 Statement。這里出現(xiàn)的 Expression 和 Statement 本身是非終結符。另一個例子,語法定義:
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
表示這個 ArgumentList 可以代表一個 AssignmentExpression,或 ArgumentList,其后跟一個逗號,其后跟一個 AssignmentExpression。這個 ArgumentList 的定義是遞歸的,也就是說,它定義它自身。其結果是,一個 ArgumentList 可能包含用逗號隔開的任意正數(shù)個參數(shù),每個參數(shù)表達式是一個 AssignmentExpression。這樣,非終結符共用了遞歸的定義。
終結符或非終結符可能會出現(xiàn)后綴下標“ 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 個右側(cè)變體。
如果文法定義的冒號后面出現(xiàn)文字“one of”,那么其后一行或多行出現(xiàn)的每個終結符都是一個選擇定義。例如,ECMAScript 包含的詞法文法生產(chǎn)器:
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
這僅僅下面寫法的一種縮寫:
NonZeroDigit ::
1
2
3
4
5
6
7
8
9
如果產(chǎn)生式的右側(cè)是出現(xiàn)“[empty]”,它表明,產(chǎn)生式的右側(cè)不包含終結符或非終結符。
如果產(chǎn)生式的右側(cè)出現(xiàn)“[lookahead ? set]”,它表明,給定 set 的成員不得成為產(chǎn)生式緊隨其后的 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 后跟隨由偶數(shù)起始的一個或多個十進制數(shù)字,或一個十進制數(shù)字后面跟隨一個非十進制數(shù)字。
如果產(chǎn)生式的右側(cè)出現(xiàn)“[no LineTerminator here]”,那么它表示此產(chǎn)生式是個受限的產(chǎn)生式:如果 LineTerminator 在輸入流的指定位置出現(xiàn),那么此產(chǎn)生式將不會被適用。例如,產(chǎn)生式:
ThrowStatement :
throw [no LineTerminator here] Expression ;
表示如果程序中 return token 和 Expression 之間的出現(xiàn) LineTerminator,那么不得使用此產(chǎn)生式。
LineTerminator 除了禁止出現(xiàn)在受限的產(chǎn)生式,可以在輸入元素流的任何兩個 tokens 之間出現(xiàn)任意次數(shù),而不會影響程序的語法驗證。
當一個詞法文法產(chǎn)生式或數(shù)字字符串文法中出現(xiàn)多字符 token,它表示此字符序列將注冊一個 token。
使用詞組“but not“可以指定某些不允許在產(chǎn)生式右側(cè)的擴展,它說明排除這個擴展。例如,產(chǎn)生式:
Identifier ::
IdentifierName but not ReservedWord
此非終結符 Identifier 可以由可替換成 IdentifierName 的字符序列替換,相同的字符序列不能替換 ReservedWord。
最后,對于實際上不可能列出全部可變元的少量非終結符,我們用普通字體寫出描述性的短語來描述它們:
SourceCharacter ::
any Unicode code unit
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: