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