一个民工级的JavaScript-AST-Parser

38次阅读

共计 797 个字符,预计需要花费 2 分钟才能阅读完成。

局部极大优先级匹配:

  • 输入:a+b|c*d/e
  • 第一次扫描:a+bb|c 都能结合,+ 优先级比 | 高,a+b 优先匹配,结果:(a+b)|c*d/e
  • 第二次扫描:(a+b)|cc*dd/e 都能结合,* 优先级比 | 高,*/ 相同,左结合 * 为优先级局部极值,结果:(a+b)|(c*d)/e
  • 第三次扫描结果:(a+b)|((c*d)/e)
  • 第四次扫描结果:((a+b)|((c*d)/e))

右结合

  • 将优先级判别式 left_prec>=right_prec分解成 left_prec>right_prec || left_prec===Number(right_prec) 这样当 left_prec 为 Number 实例时,new Number(prec)===Number(prec) 也不会成立,自然 left_prec 不会是优先级局部极值

匹配收集器

  • 根据各种 pattern 构建多级嵌套匹配树,查找各种符合的匹配

例如 FunctionExpression 收集器:

{
    async: _Or(_Series(_Mark(true), _NonCollecting("Keyword async")),
        _Mark(false)
    ),
    __: _NonCollecting("Keyword function"),
    generator: _Or(_Series(_Mark(true), _NonCollecting("Punctuator *")),
        _Mark(false)
    ),
    id: _Or(IDENTIFIER_OR_THROW_STRICT_RESERVED_WORDS_PATTERN, _Mark(null)),
    params: "Punctuator ()",
    body: "Punctuator {}",
    expression: _Mark(false)
}

本来想弄个够用的自定义语法分析器好接着弄个将前端归一化的架子,现在越搞路越长
目前 parser 架子地址:Dison

正文完
 0