ECMAScript 2016 Language Specification (5)

語義

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)符InputElementDivInputElementTemplateTail哆致,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)符號ScriptModule開始。
當(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市右犹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姚垃,老刑警劉巖念链,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異积糯,居然都是意外死亡掂墓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門看成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來君编,“玉大人,你說我怎么就攤上這事川慌〕院伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵梦重,是天一觀的道長兑燥。 經(jīng)常有香客問我,道長琴拧,這世上最難降的妖魔是什么降瞳? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蚓胸,結(jié)果婚禮上挣饥,老公的妹妹穿的比我還像新娘。我一直安慰自己沛膳,他們只是感情好扔枫,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著于置,像睡著了一般茧吊。 火紅的嫁衣襯著肌膚如雪贞岭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天搓侄,我揣著相機(jī)與錄音瞄桨,去河邊找鬼。 笑死讶踪,一個胖子當(dāng)著我的面吹牛芯侥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳讥,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼柱查,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了云石?” 一聲冷哼從身側(cè)響起唉工,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汹忠,沒想到半個月后淋硝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡宽菜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年谣膳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铅乡。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡继谚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阵幸,到底是詐尸還是另有隱情花履,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布侨嘀,位于F島的核電站臭挽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咬腕。R本人自食惡果不足惜欢峰,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涨共。 院中可真熱鬧纽帖,春花似錦、人聲如沸举反。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火鼻。三九已至室囊,卻和暖如春雕崩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背融撞。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工盼铁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尝偎。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓饶火,卻偏偏與公主長得像,于是被迫代替她去往敵國和親致扯。 傳聞我的和親對象是個殘疾皇子肤寝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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