ECMAScript 2016 Language Specification (5)

語義

5.1 句法和語法

5.1.1 上下文無關(guān)語法

一個上下文無關(guān)的語法包含一系列產(chǎn)生式productions。每個產(chǎn)生式都有一個叫做非終端符的抽象符號作為左位,然后一系列零個或者多個非終端符或者終端符作為右位。對于每個語法來說,每個終端符都來源于一張?zhí)厥獾姆柋怼?br> 一個鏈式生產(chǎn)式的右位有切僅有一個非終端符加上另個或多個終端符。(2016單獨加的)

當從一個叫做 目標符goal symbol 的特殊非終端符組成的句子起始,那么給出的上下文無關(guān)文法就表示 語言 language,即,將產(chǎn)生式右邊序列的非終結(jié)符當作左邊,進行反復(fù)替換的結(jié)果就成為可能的終結(jié)符序列集合可能無限

5.1.2 詞法和正則語法

EMCAScript的詞法在11章會的提到。該語法有它自己的根據(jù)10.1章定義的源字符終端符編碼單元。他定義了一系列的產(chǎn)生式,從目標符InputElementDivInputElementTemplateTailInputElementTefExpInputElementRegExpOrTemplateTail開始,描述源字符序列是如何被翻譯成輸入元素序列的。
除了空格和注釋的輸入元素構(gòu)成EMACScript句法的終端符,叫做ECMAScript token。這些Tokens是ECMAScript 語言的保留字,標識符,字面量,標點符號。以及,盡管不能作為tokens,行結(jié)束符也會作為輸入元素流的一部分,并自動插入分號(11.9)。單獨的空格和單行注釋會被拋棄而不會出現(xiàn)在句法的元素輸入流中。多行注釋(由/.../所構(gòu)成,無論是不是一行都會被忽略)如果不含行結(jié)束符就會單純的直接被忽略,單如果一個多行注釋包括一個或者多個行結(jié)束符,它就會被一個行結(jié)束符替換,然后成為句法的輸入元素流中的一部分。
一個ECMAScript正則表達式語法在本說明21.2.1中。該語法有由SourceCharacter定義的代碼作為終端符。這里定義了一些列產(chǎn)生式,以目標符Pattern開始,這描述了代碼學了是如何轉(zhuǎn)義成常規(guī)表達式的。
詞法和正則語法的產(chǎn)生式由 含有兩個“::”作為分割標點來做為區(qū)別。正則和詞法語法共享一部分產(chǎn)生式。

5.1.3 數(shù)字字符串語法

另一個語法用來將字符串轉(zhuǎn)換成數(shù)值。該語法類似于一部分處理數(shù)值字面量的詞法,并有SourceCharacter的終端符。該語法在7.1.3.1中出現(xiàn)。
數(shù)值語法產(chǎn)生式由作為標點的“:::”來做識別。

5.1.4 句法

ECMAScript句法在11、12、13、14和15章中講解。這語法由詞法定義的ECMAScript tokens作為終端符。該語法定義一系列產(chǎn)生式,從兩個描述了語法正確的 ECMAScript 程序應(yīng)該怎樣排列 tokens的選擇目標符號ScriptModule開始。
當代碼流被解析成一個ECMAScript腳本或者模塊時,它首先通過重復(fù)調(diào)用詞法語法而被轉(zhuǎn)換成一個輸入元素流;之后由負責句法的單應(yīng)用來解析這段輸入元素流。如果輸入流中的tokens不能被解析為(腳本或者模型)目標終端符的單實例,又沒有額外的tokens剩下,則該輸入流屬于句法錯誤。
只含有一個“:”作為標點是產(chǎn)生式句法的標識。
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腳本或模型。舉個例子,這個技巧用在對象字面量和對象解析模式里,在該情形下,一個有更多限制的補充語法會在將來限制可接受的token序列。在某些情況下,當顯式指定,輸入元素對應(yīng)于這樣一個生產(chǎn)再次解析使用目標補充語法的象征。如果輸入流中的token由語法解析時不能作為被解析成一個對應(yīng)的補充目標符號的單一實例,輸入流在句法上是錯誤的。

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(賦值表達式)或者一個ArgumentList(參數(shù)列),然后跟著一個逗號,然后跟著AssignmentExpression(賦值表達式)。這種參數(shù)列定義的定義是遞歸的,即是,它自己定義自己。結(jié)果就是一個ArgumentList可能包含正數(shù)個由逗號分隔的參數(shù),每個參數(shù)表達式都是一個AssignmentExpression。這種非終結(jié)符的遞歸定義很常見。
在一個終結(jié)符或者非終結(jié)符后面會出現(xiàn)下標“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)的下標注釋參數(shù)化。這個會被產(chǎn)生式定義成非終端符號的下標。“parametes(下標狀態(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容