codecamp

自动分号插入规则

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

左到右解析程序,当遇到一个不符合任何文法产生式的 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,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }