語義
5.1 句法和語法
5.1.1 上下文無關(guān)語法
一個上下文無關(guān)的語法包含一系列產(chǎn)生式productions棚潦。每個產(chǎn)生式都有一個叫做非終端符的抽象符號作為左位,然后一系列零個或者多個非終端符或者終端符作為右位膝昆。對于每個語法來說丸边,每個終端符都來源于一張?zhí)厥獾姆柋怼?br> 一個鏈?zhǔn)缴a(chǎn)式的右位有切僅有一個非終端符加上另個或多個終端符。(2016單獨加的)
當(dāng)從一個叫做 目標(biāo)符goal symbol 的特殊非終端符組成的句子起始荚孵,那么給出的上下文無關(guān)文法就表示 語言 language妹窖,即,將產(chǎn)生式右邊序列的非終結(jié)符當(dāng)作左邊处窥,進(jìn)行反復(fù)替換的結(jié)果就成為可能的終結(jié)符序列集合可能無限嘱吗。
5.1.2 詞法和正則語法
EMCAScript的詞法在11章會的提到。該語法有它自己的根據(jù)10.1章定義的源字符終端符編碼單元滔驾。他定義了一系列的產(chǎn)生式谒麦,從目標(biāo)符InputElementDiv,InputElementTemplateTail哆致,InputElementTefExp绕德,InputElementRegExpOrTemplateTail開始,描述源字符序列是如何被翻譯成輸入元素序列的摊阀。
除了空格和注釋的輸入元素構(gòu)成EMACScript句法的終端符耻蛇,叫做ECMAScript token。這些Tokens是ECMAScript 語言的保留字胞此,標(biāo)識符臣咖,字面量,標(biāo)點符號漱牵。以及夺蛇,盡管不能作為tokens,行結(jié)束符也會作為輸入元素流的一部分酣胀,并自動插入分號(11.9)刁赦。單獨的空格和單行注釋會被拋棄而不會出現(xiàn)在句法的元素輸入流中。多行注釋(由/.../所構(gòu)成闻镶,無論是不是一行都會被忽略)如果不含行結(jié)束符就會單純的直接被忽略甚脉,單如果一個多行注釋包括一個或者多個行結(jié)束符,它就會被一個行結(jié)束符替換铆农,然后成為句法的輸入元素流中的一部分牺氨。
一個ECMAScript正則表達(dá)式語法在本說明21.2.1中。該語法有由SourceCharacter定義的代碼作為終端符。這里定義了一些列產(chǎn)生式波闹,以目標(biāo)符Pattern開始酝豪,這描述了代碼學(xué)了是如何轉(zhuǎn)義成常規(guī)表達(dá)式的。
詞法和正則語法的產(chǎn)生式由 含有兩個“::”作為分割標(biāo)點來做為區(qū)別精堕。正則和詞法語法共享一部分產(chǎn)生式。
5.1.3 數(shù)字字符串語法
另一個語法用來將字符串轉(zhuǎn)換成數(shù)值蒲障。該語法類似于一部分處理數(shù)值字面量的詞法歹篓,并有SourceCharacter的終端符。該語法在7.1.3.1中出現(xiàn)揉阎。
數(shù)值語法產(chǎn)生式由作為標(biāo)點的“:::”來做識別庄撮。
5.1.4 句法
ECMAScript句法在11、12毙籽、13洞斯、14和15章中講解。這語法由詞法定義的ECMAScript tokens作為終端符坑赡。該語法定義一系列產(chǎn)生式烙如,從兩個描述了語法正確的 ECMAScript 程序應(yīng)該怎樣排列 tokens的選擇目標(biāo)符號Script和Module開始。
當(dāng)代碼流被解析成一個ECMAScript腳本或者模塊時毅否,它首先通過重復(fù)調(diào)用詞法語法而被轉(zhuǎn)換成一個輸入元素流亚铁;之后由負(fù)責(zé)句法的單應(yīng)用來解析這段輸入元素流。如果輸入流中的tokens不能被解析為(腳本或者模型)目標(biāo)終端符的單實例螟加,又沒有額外的tokens剩下徘溢,則該輸入流屬于句法錯誤。
只含有一個“:”作為標(biāo)點是產(chǎn)生式句法的標(biāo)識捆探。
12 13 14 15章中介紹的句法并不是一個正確ECMAScript腳本或者模型能接受的所有token的完整集合然爆。某些額外的tokens序列也能被接受,特別來說黍图,如那些語法描述的那樣曾雕,分號被添加在句子里正確的地方(比如說位于行結(jié)束符字符之前)。更多雌隅,比如一個行結(jié)束符出現(xiàn)在確定的“awkward”位置這種情況翻默,根據(jù)的語法描述這些特定的token序列是不能被接受的。
(以下為ecmascript2016額外內(nèi)容)
某些特定情況下恰起,為了避免句法產(chǎn)生的歧義修械,句法使用通用產(chǎn)生式允許token序列不構(gòu)成一個有效的ECMAScript腳本或模型。舉個例子检盼,這個技巧用在對象字面量和對象解析模式里肯污,在該情形下,一個有更多限制的補(bǔ)充語法會在將來限制可接受的token序列。在某些情況下蹦渣,當(dāng)顯式指定哄芜,輸入元素對應(yīng)于這樣一個生產(chǎn)再次解析使用目標(biāo)補(bǔ)充語法的象征。如果輸入流中的token由語法解析時不能作為被解析成一個對應(yīng)的補(bǔ)充目標(biāo)符號的單一實例柬唯,輸入流在句法上是錯誤的认臊。
5.1.5 語法符號
正則、詞法結(jié)束符锄奢,以及數(shù)字字符串語法都用等寬字體顯示失晴,論是在文法的產(chǎn)生式,還是貫穿本規(guī)范的所有文本直接給出的終結(jié)符拘央。他們的出現(xiàn)用來表示腳本寫的正確涂屁。所以按照該方法規(guī)定的終結(jié)符代碼點被理解成源自基礎(chǔ)拉丁語范圍中的Unicode編碼,而不是任何其他看上去可能的unicode范圍灰伟。
無終端符使用斜體顯示拆又。對于無終端符(也叫產(chǎn)生式)的定義,由非終結(jié)符名稱和其后定義的一個或多個冒號給出(冒號數(shù)量決定產(chǎn)生式從屬的語法)栏账。一個或多個可供選擇的代替子會緊跟在非終結(jié)符的右側(cè)帖族。如以下語法定義
*WhileStatement :*
**while (** *Expression* **)** *Statement*
聲明以下非終結(jié)符WhileStatement表示tokenWhile,然后跟隨者一個括弧token发笔,然后跟著一個Expression(語句)盟萨,然后跟著一個反括弧token,然后接著一個Statement了讨。Expression(語句)和Statement(聲明)本身都是非終端服捻激。另一個例子中,句法都如此定義:
*ArgumentList*
*AssignmentExpression*
*ArgumentList, AssignmentExpression*
聲明以下一個ArgumentList(參數(shù)列)或許表示一個單獨的AssignmentExpression(賦值表達(dá)式)或者一個ArgumentList(參數(shù)列),然后跟著一個逗號前计,然后跟著AssignmentExpression(賦值表達(dá)式)胞谭。這種參數(shù)列定義的定義是遞歸的,即是男杈,它自己定義自己丈屹。結(jié)果就是一個ArgumentList可能包含正數(shù)個由逗號分隔的參數(shù),每個參數(shù)表達(dá)式都是一個AssignmentExpression伶棒。這種非終結(jié)符的遞歸定義很常見旺垒。
在一個終結(jié)符或者非終結(jié)符后面會出現(xiàn)下標(biāo)“opt”,表明這是個可選符號肤无。實際上包含可選符號的替代子包含兩個右邊先蒋,一個是省略可選元素的,另一個是包含可選元素的宛渐。這表示:
VariableDeclaration:
BindingIdentifire Initializer opt
是以下的簡便縮寫:
VariableDeclaration:
BindingIdentifier
BindingIdentifer Initializer
以及
IterationStatement:
for ( LexicalDeclaration Expression opt ; Expression opt ) Statement
是以下的簡便縮寫:
IterationStatement
for ( LexicalDeclearation ; Expression opt ) Statement
for ( LexicalDeclearation Expresstion ; Expression opt ) Statement
最終是以下的簡寫
IterationStatement
for ( LexicalDeclearation ) Statement
for ( LexicalDecleafation ; Expression ) Statement
for ( LexicalDeclearation Expression ; ) Statement
for ( LexicalDeclearation Expression ; Expression ) Statement
所以竞漾,在本例中眯搭,非終端迭代語句實際上有4個右側(cè)符 (之前的版本是8個)
一個產(chǎn)生式也許由按照"[parameters]"結(jié)構(gòu)的下標(biāo)注釋參數(shù)化。這個會被產(chǎn)生式定義成非終端符號的下標(biāo)业岁×巯桑“parametes(下標(biāo)狀態(tài))”可能是一個單獨的名稱或者是由逗號分隔的名稱數(shù)組。一個參數(shù)化的的產(chǎn)生式意思咧由參數(shù)名稱定義的產(chǎn)生式的快速寫法笔时。由底層核心執(zhí)行棍好,最后直行程參數(shù)化非終端符號。如下所示
StatementList[Return] :
ReturnStatement
ExpressionStatement
是以下的縮寫
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
以及
StatementList[Return, In] :
ReturnStatement
ExpressionStatement
是以下內(nèi)容的縮寫
StatementList:
ReturnStatement
ExpressionStatement
StatementList_Return:
ReturnStatement
ExpressionStatement
StatementList_In:
ReturnStatement
ExpressionStatement
StatementList_Return_In:
ReturnStatement
ExpressionStatement
多重參數(shù)制造一系列產(chǎn)生式組合糊闽,不是所有都必須遵循完整的語法梳玫。
以及一個產(chǎn)生式的右側(cè)非終端符也可以參數(shù)化
StatementList:
ReturnStatement
ExpressionStatement[+In]
等同于
StatementList:
ReturnStatement
ExpressionStatement_In
以及
StatementList:
ReturnStatement
ExpressionStatement[~In]
等同于
StatementList:
ReturnStatement
ExpressionStatement