ECMAScript 2015官方文檔翻譯(三)

前言:本章講編譯方面的知識,讀起來可能會很艱難,文中提到的格式問題(比如斜體,等寬字體等)以官方文檔爲標準,本譯文由於排版問題可能會有不符合的地方。

5 符號公約

  
  5.1句法和詞彙語法
  
  5.1.1上下文無關文法
  上下文無關文法由多個產生式組成。每個產生式都有一個抽象符號(稱爲非終結符)作爲其左側,一個、零個或多個非終止符號和終端符號序列作爲其右側。對於每個語法,終結符從指定的字母表中繪出。
  鏈產生式是在其右側有一個非終結符,以及零或更多的終結符。
  從一個由單一非終端組成的句子(稱爲目標符號)開始,給定的上下文無關語法指定了一種語言,即(可能是無限的)可能的終結符序列集合,它可以由重複地替換其中非終端是左側的產生式的右側的序列。
  
  5.1.2詞彙和RegExp語法
  第11節給出了ECMAScript的詞彙語法。該語法具有符合10.1中定義的SourceCharacter規則的Unicode碼點的終端符號。它定義了一組表達式,從目標符號InputElementDivInputElementTemplateTailInputElementRegExpInputElementRegExpOrTemplateTail開始,它們描述瞭如何將這些代碼點序列如何轉換爲輸入元素序列。
  除空白和註釋之外的輸入元素構成ECMAScript語法的終端符號,稱爲ECMAScript tokens。這些tokens是ECMAScript語言的保留字,標識符,文字和標點符號。此外,line terminator(線路終端器、行終止符)雖然不被認爲是tokens,但也成爲輸入元件流的一部分,並指導了自動分號插入過程(11.9)。簡單的空白和單行註釋被丟棄,不會出現在句法語法的輸入元素流中。一個MultiLineComment(也就是說,/*…… */形式的評論不管它是否跨越多行)如果不包含任何行終止符同樣簡單地被丟棄; 但是如果MultiLineComment包含一個或多個行終止符,那麼它將被單行終止符替代,該行終止符成爲syntactic grammar(句法語法)的輸入元素流的一部分。
  ECMAScript 的RegExp語法在21.2.1中給出。這個語法也有它的終端符號,由SourceCharacter定義的代碼點。它定義了一組生成,從目標符號Pattern開始,描述代碼點的序列如何轉換爲正則表達式模式。
  詞法和RegExp語法的生成通過將兩個冒號“ :: ”作爲分隔標點來區分。詞彙和RegExp語法分享一些表達式。
  
  5.1.3數字字符串語法
  另一種語法用於將字符串轉換爲數值。這個語法類似於lexical grammar(詞法語法)與數字文字有關的部分,並具有其終端符號SourceCharacter。該語法出現在7.1.3.1中。
  通過將三個冒號“ ::: ”作爲標點符號來區分數字字符串語法的生成。
  
  5.1.4句法語法
  用於ECMAScript的句法語法在第11,12,13,14,15節給出。此語法具有被詞法語法定義的ECMAScript的tokens作爲其終端符號(定義5.1.2)。它定義了一組產生式,從兩個替代目標符號Script (腳本)和Module(模塊)開始,描述了tokens序列如何在語法上正確地構成ECMAScript程序獨立組件。
  當代碼點流被解析爲ECMAScript 腳本或模塊時,首先通過重複應用詞彙語法被轉換成輸入元素的流; 然後,這個輸入元素流由句法語法的單個應用解析。如果輸入元素流中的tokens不能被解析爲目標非終結符(腳本或模塊)的單個實例,且沒有 tokens遺漏,則輸入流在語法上是錯誤的。
  句法語法的產生式通過僅使用一個冒號“ : ”作爲標點符號來區分。
  第12,13,14和15條中提出的句法語法不是完整的記錄哪個 tokens序列被接受爲正確的ECMAScript 腳本或模塊。某些額外的令牌序列也被接受,也就是說,只要在某些序列的特定地方中添加了分號(例如在行終止符之前),那麼這些序列將被語法描述。此外,如果在某些“尷尬”的地方出現行終止符,則語法所描述的某些tokens序列被認爲是不可接受的。
  在某些情況下,爲了避免歧義,句法語法使用了通用的產生式,允許標記序列不構成有效ECMAScript 腳本或模塊的tokens序列。例如,該技術用於對象字面量和對象解構模式。在這種情況下,提供了更加嚴格的 補充語法,其進一步限制可接受的tokens序列。 在某些上下文中,與此類產生式相對應的輸入元素會再次被使用補充語法的目標符號解析。
  
  5.1.5語法符號
  詞法,RegExp和數字字符串語法的終端符號都以fixed width(等寬樣式)字體顯示,無論是語法的產生式還是在整個本規範中,只要文本直接引用這樣的終端符號。其都將以書面形式出現在腳本中。以這種方式指定的所有終端符號代碼點應被理解爲來自基本拉丁語範圍的適當的Unicode代碼點,而不是來自其他Unicode範圍的任何類似代碼點。
  非終端符號以斜體顯示。非終止(也稱爲“產生式”)的定義是由一個或多個冒號後面定義的非終結符的名稱引入的。(冒號指示產生式屬於哪種語法)。非終結符的一個或多個可替代右手邊跟着連續的行。例如,句法定義:

WhileStatement :
   while (Expression) Statement

  表示非終結的WhileStatement表示token while,後跟左括號標記,後跟一個表達式,後跟右括號標記,後跟一個Statement(語句)。表達式和語句的出現是它們自己的非終端。另一個例子,句法定義:

ArgumentList :
   AssignmentExpression
   ArgumentList , AssignmentExpression

  一個ArgumentList也許代表了一個單一的AssignmentExpression或者一個ArgumentList,然後是一個逗號,然後是一個AssignmentExpression。這個ArgumentList的定義是遞歸的,也就是說,它是根據它本身來定義的。這樣的結果就是,一個ArgumentList也許會包含任意數量逗號分隔的正參數,其中的每個argument表達式是一個AssignmentExpression。這樣的非終結符的遞歸定義是非常常見的。
  下標後綴“ opt ”,它可能出現在終端或非終端之後,表示一個可選的符號。包含可選符號實際上指定了兩個右側,一個省略了可選元素,另一個包含它。這意味着:

VariableDeclaration :
   BindingIdentifier Initializeropt

是下面的縮寫:

VariableDeclaration :
   BindingIdentifier Initializeropt

然後還有:

IterationStatement :
   for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

是下面的縮寫:

IterationStatement :
   for ( LexicalDeclaration ; Expressionopt ) Statement
   for ( LexicalDeclaration Expression ; Expressionopt ) Statement

這又是一個縮寫:

IterationStatement :
   for ( LexicalDeclaration ; ) Statement
   for ( LexicalDeclaration ; Expression ) Statement
   for ( LexicalDeclaration Expression ; ) Statement
   for ( LexicalDeclaration Expression ; Expression ) Statement

  所以在這個例子中,非終結符迭代語句實際上有四個可選的右側。
  一個產生式可以通過“ [parameters] ” 形式的下標註釋進行參數化,這可以作爲產生式定義的非終結符號的後綴。“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[In]

相當於說:

StatementList :
   ReturnStatement
   ExpressionStatement_In

  非終止引用可能同時具有參數列表和“ opt ”後綴。例如:

VariableDeclaration :
   BindingIdentifier Initializer[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]”出現在產生式的右側,則表示如果緊隨其後的輸入token序列是給定的成員可以不使用產生式 集合。該集合可以寫成逗號分隔的一個或兩個元素終端序列的列表,其中括號包含在大括號中。爲了方便起見,該集合也可以被寫爲非終結符,在這種情況下,它表示非終端可以擴展的所有終端的集合。如果該組由單個終端組成,則可以使用短語“[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後跟一個或多個十進制數字,其中第一個是偶數,或一個十進制數字不跟隨另一個十進制數字。
  如果在句法語法產生式的右側出現短語“[no LineTerminator here]”,則表示產生式是受限產生式:如果LineTerminator出現在輸入流中,則可能不會使用指示位置。例如,產生式:
  

ThrowStatement :
   throw [no LineTerminator here] Expression ;

  表示在throw token和表達式之間的腳本中出現LineTerminator(行終結符)時,不能使用產生式。
  除非被限制的產生式禁止使用LineTerminator,否則在輸入元素的流中,任何兩個連續的標記之間都可能出現任意數量的LineTerminator,而不會影響腳本的語法可接受性。
  當在詞彙語法或數字字符串語法的產生式中出現一個可選方案且是一個多碼點標記時,它代表將構成這樣一個token的代碼點序列。
  產生式的右側可以指定通過使用短語“but not” ,而不允許某些擴展,然後指示被排除的擴展。例如,產生式:
  

Identifier ::
   IdentifierName but not ReservedWord

  意味着非終結標識符可以被任何可能替代IdentifierName 的代碼點序列替換,只要相同的代碼點序列不能替代ReservedWord。
  最後,在sans - serif(無襯線字體)類型中,一些非終結符號用一種描述性的短語來描述,在這些情況下,列出所有備選方案是不切實際的:

SourceCharacter ::
   any Unicode code point

  5.2算法約定
  規範通常使用編號列表來指定算法中的步驟。這些算法用於精確地指定ECMAScript語言結構所需的語義。這些算法並不意味着使用任何特定的實現技術。在實踐中,可能有更有效的算法可用於實現給定的特徵。
  算法可以顯式地參數化,在這種情況下,參數的名稱和用法必須作爲算法定義的一部分提供。爲了便於在本規範的多個部分使用它們,稱爲抽象 操作的一些算法以參數化的函數形式命名和寫入,以便可以通過其他算法中的名稱來引用它們。一些抽象操作被視爲類類規範抽象的多態調度方法。這種類似方法的抽象操作通常使用諸如operationName(arg1,arg2)之類的函數應用程序引用。
  算法可能與ECMAScript語法之一的產生式相關聯。具有多個替代定義的產生式通常對於每種替代方案具有不同的算法。當算法與語法產生式相關聯時,它可以引用產生式替代的終端和非終止符號,就像它們是算法的參數一樣。當以這種方式使用時,非終止符號是指解析源文本時匹配的實際替代定義。
  當算法與產生式替代方案相關聯時,通常會顯示替代方案,而沒有任何“[ ]”語法註釋。這樣的註釋只能影響替代方法的句法識別,並且對替代方案的相關語義沒有影響。
  除非另有明確規定,否則所有連鎖產生式對於可能應用於產生式的左側非終端的每個算法都有隱含的定義。隱式定義簡單地將具有相同參數的相同算法名稱(如果有的話)重新應用於鏈產生式的唯一右手側的非終止,然後返回結果。例如,假設有一個產生式:

Block :
   { StatementList }

  但是並沒有明確指定該產生式的相應的評估算法。如果在一些算法中有一個形式的語句:“ 返回評估塊的結果 ”,則隱含的是一個評估算法存在的形式:
  運行時語義:評估

Block : { StatementList }
   1. 返回評估StatementList的結果。

  爲了表達的清楚,算法步驟可以被細分爲順序子步驟。子項縮進,本身可以進一步劃分成縮進的子步驟。輪大綱編號的約定是用來確定子步驟的第一級的子步驟,標記小寫字母的字符和第二級的子步驟,用小寫羅馬數字標記。如果需要三級以上,則這些規則使用數字標籤與第四級重複。例如:

Top-level step
   a. Substep
   b. Substep.
     i. Subsubstep。
       1. Subsubsubstep
         a.Subsubsubsubstep
           i. Subsubsubsubsubstep

  步驟或子步驟可以被寫爲條件其子步驟的“if”謂詞。在這種情況下,只有在謂詞爲真的情況下才應用子步驟。如果一個步驟或子步驟以“else”一詞開始,那麼它是一個謂詞,它是同一級別上一個“if”謂詞步驟的否定。
  步驟可以指定其子步驟的迭代應用。
  以“Assert:”開頭的一個步驟說明了其算法的不變條件。這樣的斷言用於顯式算法不變量,否則將是隱式的。這種斷言不會增加額外的語義要求,因此不需要由實現來檢查。它們僅用於闡明算法。
  數學運算如加法,減法,否定,乘法,除法以及本章後面定義的數學函數應該被理解爲計算數學實數的精確數學結果,除非另有說明,否則不包括無窮大,不包括與正零區分的負零。該標準中的浮點運算模型的算法包括明確的步驟,在必要時,處理無窮大並簽名爲零並執行舍入。如果將數學運算或函數應用於浮點數,則應理解爲應用於由該浮點數表示的精確數學值; 這樣一個浮點數必須是有限的,並且如果是+ 0或−0則相應的數學值是0。
  數學函數abs(x)產生x的絕對值,即如果x是負數(小於零) 取x,否則是x本身。
  數學函數 sign(x)如果x是正數產生1,如果x是負的產生-1。在這個標準中,當x爲0時,sign函數沒有使用。
  數學函數min(x1, x2,…,xn)產生 x 1到x n中最小的數。數學函數max(x1, x2,…, xn)產生x 1到x n中最大的數。這些數學函數的範圍包括+ ∞和-∞。
  符號“x modulo y”(y必須是有限的,並且非零)計算一個計算與y(或0)相同符號的k值,使得對於一些整數q,abs(k) < abs(y) 並且x−k = q × y。
  數學函數floor(x)產生不大於x的最大整數(最接近正無窮大)。
  注:floor(x)= x - (x模1)。

  5.3靜態語義規則
  上下文無關的語法沒有足夠的功能來表達所有的規則,它們定義輸入元素流是否形成可以被評估的有效的ECMAScript 腳本或模塊。在某些情況下,需要使用ECMAScript算法約定或散文要求來表達額外的規則。這樣的規則總是與語法的產生式相關聯,並被稱爲產生式的靜態語義。
  靜態語義規則具有名稱,通常使用算法定義。命名靜態語義規則與語法產生式相關聯,並且具有多個替代定義的產生式通常會爲每個可應用的命名靜態語義規則提供不同的算法。
  除非另有說明,否則本規範中的每個語法產生式替代方案都隱含地具有名爲Contains的靜態語義規則的定義,該靜態語義規則採用名爲symbol的參數,其值爲包含關聯產生式的語法的終端或非終端。Contains的默認定義是:

  1. 對於每個終端和非終結語法符號,sym,在這個產生式的定義中
       a. 如果sym是與 symbol相同的語法符號,則返回true。
       b. 如果sym是非終端的,那麼
         i. 令contained 顯示 sym包含symbol的結果。
         ii. 如果contained是true,則返回true。
  2. 返回假。

  上述定義明確地被覆蓋了特定的產生式。
  一種特殊的靜態語義規則是一個早期錯誤規則。早期的錯誤規則定義了早期的錯誤條件(參見第16條),它與特定的語法制作相關聯。大多數早期錯誤規則的評估在本規範的算法中沒有顯式地調用。在腳本或 模塊的首次評估之前,必須驗證所有用於解析該腳本或模塊的產生式的早期錯誤規則。如果任何早期錯誤規則被違反,腳本或模塊將無效,無法評估。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章