一个民工级的JavaScript AST Parser

FEFF01

局部极大优先级匹配:

  • 输入: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

阅读 301
1 声望
0 粉丝
0 条评论
你知道吗?

1 声望
0 粉丝
宣传栏