Ned*_*der 10 javascript python lexical-analysis tokenize
JsLex是一个用Python编写的Javascript词法分析器.它对一天的工作(或左右)做得很好,但我确信有些情况会出错.特别是,它对分号插入一无所知,并且可能存在对lexing很重要的方法.我只是不知道它们是什么.
什么Javascript代码JsLex lex错误?我对JsLex错误识别正则表达式文字的有效Javascript源特别感兴趣.
为了清楚起见,"lexing"我的意思是在源文件中识别令牌.JsLex不会尝试解析Javascript,更不用说执行它了.我已经写过JsLex做完全lexing,但老实说,如果它能够成功找到所有的正则表达式文字,我会很高兴.
有趣的是,我用JS编写的lexer/evaluationator的代码尝试了你的词法分析器;)你是对的,它对正则表达式并不总是很好.这里有一些例子:
rexl.re = {
NAME: /^(?!\d)(?:\w)+|^"(?:[^"]|"")+"/,
UNQUOTED_LITERAL: /^@(?:(?!\d)(?:\w|\:)+|^"(?:[^"]|"")+")\[[^\]]+\]/,
QUOTED_LITERAL: /^'(?:[^']|'')*'/,
NUMERIC_LITERAL: /^[0-9]+(?:\.[0-9]*(?:[eE][-+][0-9]+)?)?/,
SYMBOL: /^(?:==|=|<>|<=|<|>=|>|!~~|!~|~~|~|!==|!=|!~=|!~|!|&|\||\.|\:|,|\(|\)|\[|\]|\{|\}|\?|\:|;|@|\^|\/\+|\/|\*|\+|-)/
};
Run Code Online (Sandbox Code Playgroud)
这个很好 - 只是UNQUITED_LITERAL不被认可,否则一切都很好.但是现在让我们做一个小小的补充:
rexl.re = {
NAME: /^(?!\d)(?:\w)+|^"(?:[^"]|"")+"/,
UNQUOTED_LITERAL: /^@(?:(?!\d)(?:\w|\:)+|^"(?:[^"]|"")+")\[[^\]]+\]/,
QUOTED_LITERAL: /^'(?:[^']|'')*'/,
NUMERIC_LITERAL: /^[0-9]+(?:\.[0-9]*(?:[eE][-+][0-9]+)?)?/,
SYMBOL: /^(?:==|=|<>|<=|<|>=|>|!~~|!~|~~|~|!==|!=|!~=|!~|!|&|\||\.|\:|,|\(|\)|\[|\]|\{|\}|\?|\:|;|@|\^|\/\+|\/|\*|\+|-)/
};
str = '"';
Run Code Online (Sandbox Code Playgroud)
现在所有人都在NAME'sregexp之后弄乱了.它制作了一个大字符串.我认为后一个问题是String令牌过于贪婪.前一个可能是regex令牌的智能正则表达式.
编辑:我想我已经修复了regex令牌的正则表达式.在您的代码中,使用以下表达式替换第146-153行(整个"后续字符"部分):
([^/]|(?<!\\)(?<=\\)/)*
Run Code Online (Sandbox Code Playgroud)
这个想法是允许除了/允许\/但不允许的所有内容\\/.
编辑:另一个有趣的案例,修复后传递,但作为内置测试用例添加可能会很有趣:
case 'UNQUOTED_LITERAL':
case 'QUOTED_LITERAL': {
this._js = "e.str(\"" + this.value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\")";
break;
}
Run Code Online (Sandbox Code Playgroud)
编辑:又一个案例.关键字似乎也过于贪婪.看情况:
var clazz = function() {
if (clazz.__) return delete(clazz.__);
this.constructor = clazz;
if(constructor)
constructor.apply(this, arguments);
};
Run Code Online (Sandbox Code Playgroud)
它将它理解为:(keyword, const), (id, ructor).标识符也是如此inherits:in和herits.