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日 |
1398 在 Web编程
388 每月下载量
用于 6 个crate (5 直接)
1MB
24K SLoC
极其快速、无损和容错的JavaScript解析器。
解析器通过非空白标记的抽象使用。这允许我们无损或损失性地解析代码,而无需显式处理空白。解析器产生事件,而不是AST,这些事件被解析为无类型的语法节点,然后可以将其转换为有类型的AST。
解析器能够从任何源代码生成有效的AST。错误生成被包装到ERROR
语法节点中,原始源代码在最终的语法节点中得到完全表示。
除非您想解析Js源代码片段或创建自己的生成,否则可能不需要使用解析器结构体。相反,请使用如parse_text
和parse_text_lossy
这样的函数,它们提供了解析的抽象版本。
解析器的显著特性包括
- 通过极其快速的
rslint_lexer
进行极其快速的解析和词法分析。 - 能够根据需要执行有损或无损解析,而无需显式处理空白。
- 可定制,能够根据您的意愿解析任何JS代码片段。
- 完全容错,能够从任何源代码生成AST。
- 将无类型节点转换为有类型AST没有成本。
- 能够以几乎零成本非常容易地从AST到语法节点到语法标记到源代码再返回。
- 通过
SyntaxNode
进行非常容易的树遍历。 - 具有多个标签和注释的描述性错误。
- 非常便宜的克隆,克隆AST节点或语法节点相当于向Rc添加一个引用的成本。
- 便宜的增量重新解析更改的文本。
该crate还包括如下的实用工具
- ANSI语法高亮节点(通过
util
或文本通过rslint_lexer
)。 - 通过
SyntaxNodeExt
提供丰富的语法节点实用函数。
它受到rust analyzer解析器的启发,但针对JavaScript进行了适配。
语法节点与AST节点
该包依赖于无类型SyntaxNode
与有类型AstNode
的概念。语法节点以无类型方式表示语法树。它们通过两个指针表示不可变树中的位置。语法树由SyntaxNode
和SyntaxToken
组成,以嵌套树结构。每个节点可以有父节点、兄弟节点、子节点、后代节点等。
AstNode
表示语法节点的有类型版本。它们与语法节点有完全相同的表示,因此两者之间的转换具有零运行时成本。AST节点的每个数据项都是可选的,这是由于解析器完全容错。
每种表示方法都有其优点
语法节点
- 通过函数非常简单地进行语法树的遍历。
- 可以轻松地将它们转换为底层文本、范围或标记。
- 包含与底层生产相关的所有空白(在无损解析的情况下)。
- 可以以零成本轻松转换为它的有类型表示。
- 可以使用fmt debug转换为美观的表示。
AST节点
- 可以轻松访问底层生产属性。
- 转换为语法节点具有零成本。
总的来说,使用这两种表示方法意味着我们不受限于通过有类型节点进行操作。这使得遍历变得困难,并且您通常必须求助于自动生成的访问者模式。AST节点是简单访问语法节点子属性的一种方式。
依赖关系
~2.4–10MB
~84K SLoC