8个版本

0.3.1 2021年10月6日
0.3.0 2021年9月16日
0.2.1 2020年10月21日
0.1.3 2020年10月6日

1398Web编程

Download history 132/week @ 2024-03-11 113/week @ 2024-03-18 103/week @ 2024-03-25 157/week @ 2024-04-01 147/week @ 2024-04-08 179/week @ 2024-04-15 104/week @ 2024-04-22 185/week @ 2024-04-29 139/week @ 2024-05-06 192/week @ 2024-05-13 165/week @ 2024-05-20 174/week @ 2024-05-27 96/week @ 2024-06-03 115/week @ 2024-06-10 100/week @ 2024-06-17 70/week @ 2024-06-24

388 每月下载量
用于 6 个crate (5 直接)

MIT 许可证

1MB
24K SLoC

极其快速、无损和容错的JavaScript解析器。

解析器通过非空白标记的抽象使用。这允许我们无损或损失性地解析代码,而无需显式处理空白。解析器产生事件,而不是AST,这些事件被解析为无类型的语法节点,然后可以将其转换为有类型的AST。

解析器能够从任何源代码生成有效的AST。错误生成被包装到ERROR语法节点中,原始源代码在最终的语法节点中得到完全表示。

除非您想解析Js源代码片段或创建自己的生成,否则可能不需要使用解析器结构体。相反,请使用如parse_textparse_text_lossy这样的函数,它们提供了解析的抽象版本。

解析器的显著特性包括

  • 通过极其快速的rslint_lexer进行极其快速的解析和词法分析。
  • 能够根据需要执行有损或无损解析,而无需显式处理空白。
  • 可定制,能够根据您的意愿解析任何JS代码片段。
  • 完全容错,能够从任何源代码生成AST。
  • 将无类型节点转换为有类型AST没有成本。
  • 能够以几乎零成本非常容易地从AST到语法节点到语法标记到源代码再返回。
  • 通过SyntaxNode进行非常容易的树遍历。
  • 具有多个标签和注释的描述性错误。
  • 非常便宜的克隆,克隆AST节点或语法节点相当于向Rc添加一个引用的成本。
  • 便宜的增量重新解析更改的文本。

该crate还包括如下的实用工具

  • ANSI语法高亮节点(通过util或文本通过rslint_lexer)。
  • 通过SyntaxNodeExt提供丰富的语法节点实用函数。

它受到rust analyzer解析器的启发,但针对JavaScript进行了适配。

语法节点与AST节点

该包依赖于无类型SyntaxNode与有类型AstNode的概念。语法节点以无类型方式表示语法树。它们通过两个指针表示不可变树中的位置。语法树由SyntaxNodeSyntaxToken组成,以嵌套树结构。每个节点可以有父节点、兄弟节点、子节点、后代节点等。

AstNode表示语法节点的有类型版本。它们与语法节点有完全相同的表示,因此两者之间的转换具有零运行时成本。AST节点的每个数据项都是可选的,这是由于解析器完全容错。

每种表示方法都有其优点

语法节点

  • 通过函数非常简单地进行语法树的遍历。
  • 可以轻松地将它们转换为底层文本、范围或标记。
  • 包含与底层生产相关的所有空白(在无损解析的情况下)。
  • 可以以零成本轻松转换为它的有类型表示。
  • 可以使用fmt debug转换为美观的表示。

AST节点

  • 可以轻松访问底层生产属性。
  • 转换为语法节点具有零成本。

总的来说,使用这两种表示方法意味着我们不受限于通过有类型节点进行操作。这使得遍历变得困难,并且您通常必须求助于自动生成的访问者模式。AST节点是简单访问语法节点子属性的一种方式。

依赖关系

~2.4–10MB
~84K SLoC