【发布时间】:2013-02-10 16:53:16
【问题描述】:
我正在编写一个 JavaScript 预处理器,它会在需要的地方自动插入分号。不要问为什么。
现在我知道解决这个问题的一般方法是编写一个 JavaScript 解析器,并根据规范中的 rules 在必要时添加分号。但是我不想这样做,原因如下:
- 我不想编写一个成熟的解析器。
- 我想保留 cmets 和空格。
我已经(正确地)使用简单的扫描器实现了自动分号插入的第二条和第三条规则。
但事实证明,第一条规则实施起来更具挑战性。所以我有三个问题:
- 是否可以使用具有前瞻和后瞻功能的简单扫描器来实施第一条规则?
- 如果可能,那么有人已经做到了吗?
- 如果没有,我应该如何解决这个问题?
为了完整起见,这里是三个规则:
当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记),然后自动在前面插入分号如果以下一个或多个条件为真,则违规令牌:
违规标记与前一个标记至少由一个 LineTerminator 分隔。
违规令牌是}。
当程序从左到右解析时,遇到输入令牌流的结尾,解析器无法将输入令牌流解析为单个完整的 ECMAScript 程序 em>,然后在输入流的末尾自动插入一个分号。
当程序从左到右解析时,遇到某个语法产生式允许的记号,但产生式是受限产生式,并且记号会是紧跟在受限产生式中的注释“[no LineTerminator here]”之后的终端或非终端的第一个令牌(因此这样的令牌称为受限令牌),并且受限令牌是分开的距离上一个标记至少一个 LineTerminator,然后在受限标记之前自动插入一个分号。
但是,前面的规则还有一个额外的覆盖条件:如果分号随后将被解析为空语句,或者该分号将成为 for 声明(12.6.3 部分)。
【问题讨论】:
-
是的,我要问...为什么要实现一个预处理器来完成 JS 引擎已经为你做的事情?
-
您应该使用当前版本的规范,请参阅ecma-international.org/ecma-262/5.1 或es5.github.com
-
@thesystem - 为了好玩。
-
@AaditMShah:老实说,我想不出比这更好的答案了。任何其他目的似乎都是徒劳的。
-
@Bergi - 目测自动分号插入的规则没有改变。
标签: javascript parsing preprocessor automatic-semicolon-insertion