自动分号插入规则

2018-06-16 14:57 更新

分号插入有三个基本规则:

左到右解析程序,当遇到一个不符合任何文法产生式的 token(叫做 违规 token(offending token)),那么只要满足下面条件之一就在违规 token 前面自动插入分号。至少一个 LineTerminator 分割了违规 token 和前一个 token。违规 token 是 }。

  1. 左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。   
    • 至少一个 LineTerminator 分割了违规 token 和前一个 token。
    • 违规 token 是 }。
  1. 左到右解析程序,遇到一个某些文法产生式允许的 token,但是此产生式是受限产生式,受限产生式的里紧跟在 no LineTerminator here 后的第一个终结符或非终结符的 token 叫做受限的 token,当至少一个 LineTerminator 分割了受限的 token 和前一个 token,那么就在受限 token 前面自动插入分号。

然而,上述规则有一个附加的优先条件:如果插入分号后解析结果是空语句,或如果插入分号后它成为 for 语句头部的两个分号之一(见 12.6.3),那么不会自动插入分号。


注:文法里的受限产生式只限以下:


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;


这些受限产生式的实际效果如下:

  • 当遇到的 ++ 或 --token 将要被解析器当作一个后缀运算符,并且至少有一个 LineTerminator 出现 ++ 或 --token 和它之前的 token 之间,那么在 ++ 或 --token 前面自动插入一个分号。
  • 当遇到 continue, break, return, throw token,并且在下一个 token 前面遇到 LineTerminator,那么在 continue, break, return, throw token 后面自动插入一个分号。
  • 这对 ECMAScript 程序员的实际影响是:
  • 后缀运算符 ++ 或 -- 和它的操作数应该出现在同一行。
  • return 或 throw 语句的表达式开始位置应该和 return 或 throw token 同一行。
  • break 或 continue 语句的标示符应该和 break 或 continue token 同一行。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号