什么Javascript构造JsL​​ex错误lex?

Ned*_*der 10 javascript python lexical-analysis tokenize

JsLex是一个用Python编写的Javascript词法分析器.它对一天的工作(或左右)做得很好,但我确信有些情况会出错.特别是,它对分号插入一无所知,并且可能存在对lexing很重要的方法.我只是不知道它们是什么.

什么Javascript代码JsLex lex错误?我对JsLex错误识别正则表达式文字的有效Javascript源特别感兴趣.

为了清楚起见,"lexing"我的意思是在源文件中识别令牌.JsLex不会尝试解析Javascript,更不用说执行它了.我已经写过JsLex做完全lexing,但老实说,如果它能够成功找到所有的正则表达式文字,我会很高兴.

zin*_*del 7

有趣的是,我用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.