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

时间:2011-01-18 16:14:23

标签: javascript regex token tokenize

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

2 个答案:

答案 0 :(得分:6)

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

有关详细信息,请参阅ECMAScript spec的第7节。

答案 1 :(得分:1)

遇到斜线时你必须检查上下文。如果斜杠在表达式之后,那么它必须是除法,或者它是正则表达式的开始。

为了识别上下文,也许你必须制作语法解析器。

例如

function f() {}
/1/g
//this case ,the slash is after a function definition, so it's a refexp start


var a = {}
/1/g;
//this case, the slash is after an object expression,so it's a division