令牌/ RegExp在标记Javascript时发生冲突

Orm*_*rme 8 javascript regex token tokenize

我正在编写一个简单的javascript tokenizer来检测基本类型:Word,Number,String,RegExp,Operator,Comment和Newline.一切都很顺利,但我无法理解如何检测当前字符是RegExp分隔符还是除法运算符.我没有使用正则表达式,因为它们太慢了.有人知道检测它的机制吗?谢谢.

pmd*_*boi 6

您可以通过流中的前一个标记来判断.浏览你的词法分析器发出的每个标记,并询问它是否可以合理地跟随分裂符号或正则表达式; 你会发现两个结果集的标记是不相交的.例如,(,[,{,;,和所有的二进制运算符只能接着是正则表达式.同样地,),],},标识符和串/数文字只能后跟一个除法符号.

有关更多详细信息,请参阅ECMAScript规范的第7节.

  • 从技术上讲,在词汇层面上存在一些不可避免的含糊之处.例如,`(a + b)/ c`对`if(x)/foo/.exec('bar')`(close-paren可以先于).另外,`++/foo/.abc`和`a ++/b`(plus-plus可以先于).连同`--`这些是我所知道的唯一. (4认同)
  • 我写了一个tokenizer,这些是检测"正则表达式触发器"的RE:`/ [{(\ [;,] /``/\+\+ | - |〜| && | \?|:|\|\|| \\ $ |(<< | >>>?| ==?|!=?| [ - <> +*%&\ |\^ /])=?/``/ ^(? =\s |\/ | <! - )/`,其中最后一个是脚本开头的特例. (2认同)
  • `}` 也有一个问题:`function f() {}`(newline)`/1/g` 与 `var x = {}`(newline)`/1/g`,因为后者 [不't](http://es5.github.com/#x7) 强制插入分号。 (2认同)