自動(dòng)分號(hào)插入規(guī)則

2018-06-16 14:57 更新

分號(hào)插入有三個(gè)基本規(guī)則:

左到右解析程序,當(dāng)遇到一個(gè)不符合任何文法產(chǎn)生式的 token(叫做 違規(guī) token(offending token)),那么只要滿足下面條件之一就在違規(guī) token 前面自動(dòng)插入分號(hào)。至少一個(gè) LineTerminator 分割了違規(guī) token 和前一個(gè) token。違規(guī) token 是 }。

  1. 左到右解析程序,tokens 輸入流已經(jīng)結(jié)束,當(dāng)解析器無法將輸入 token 流解析成單個(gè)完整 ECMAScript 程序 ,那么就在輸入流的結(jié)束位置自動(dòng)插入分號(hào)。   
    • 至少一個(gè) LineTerminator 分割了違規(guī) token 和前一個(gè) token。
    • 違規(guī) token 是 }。
  1. 左到右解析程序,遇到一個(gè)某些文法產(chǎn)生式允許的 token,但是此產(chǎn)生式是受限產(chǎn)生式,受限產(chǎn)生式的里緊跟在 no LineTerminator here 后的第一個(gè)終結(jié)符或非終結(jié)符的 token 叫做受限的 token,當(dāng)至少一個(gè) LineTerminator 分割了受限的 token 和前一個(gè) token,那么就在受限 token 前面自動(dòng)插入分號(hào)。

然而,上述規(guī)則有一個(gè)附加的優(yōu)先條件:如果插入分號(hào)后解析結(jié)果是空語句,或如果插入分號(hào)后它成為 for 語句頭部的兩個(gè)分號(hào)之一(見 12.6.3),那么不會(huì)自動(dòng)插入分號(hào)。


注:文法里的受限產(chǎn)生式只限以下:


PostfixExpression : 
LeftHandSideExpression [no LineTerminator here] ++ 
LeftHandSideExpression [no LineTerminator here] --
ContinueStatement : 
continue [no LineTerminator here] Identifier;
BreakStatement : 
break [no LineTerminator here] Identifier;
ReturnStatement : 
return [no LineTerminator here] Expression;
ThrowStatement : 
throw [no LineTerminator here] Expression;


這些受限產(chǎn)生式的實(shí)際效果如下:

  • 當(dāng)遇到的 ++ 或 --token 將要被解析器當(dāng)作一個(gè)后綴運(yùn)算符,并且至少有一個(gè) LineTerminator 出現(xiàn) ++ 或 --token 和它之前的 token 之間,那么在 ++ 或 --token 前面自動(dòng)插入一個(gè)分號(hào)。
  • 當(dāng)遇到 continue, break, return, throw token,并且在下一個(gè) token 前面遇到 LineTerminator,那么在 continue, break, return, throw token 后面自動(dòng)插入一個(gè)分號(hào)。
  • 這對(duì) ECMAScript 程序員的實(shí)際影響是:
  • 后綴運(yùn)算符 ++ 或 -- 和它的操作數(shù)應(yīng)該出現(xiàn)在同一行。
  • return 或 throw 語句的表達(dá)式開始位置應(yīng)該和 return 或 throw token 同一行。
  • break 或 continue 語句的標(biāo)示符應(yīng)該和 break 或 continue token 同一行。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)