28 个版本
0.1.29 | 2023 年 8 月 2 日 |
---|---|
0.1.28 | 2023 年 7 月 30 日 |
0.1.22 | 2023 年 6 月 27 日 |
在 游戏 中排名第 113
每月下载量 161
290KB
7.5K SLoC
用 Rust 编写的 Luau 和 Lua5.1 解析器和 AST
这是一个基于 tree-sitter 的 Luau 和 Lua5.1 解析器,用 Rust 编写。使用的语法是 polychromatist/tree-sitter-luau 的分支。
这个 crate 的目标是提供一个 完整 且 快速 的 Luau 解析器,同时提供格式化和 AST 遍历工具。
为什么我会创建这个,它与其他解析器有什么不同?
- 主要原因:它具有错误容忍性。AST 是按语句分割的,因此如果某个语句中存在错误,其他 AST 仍然会被生成并可以遍历。
- 它速度快、内存效率高,并且是 线程安全的,这意味着它可以用来并行处理大量 Lua 文件。我通过将 tree-sitter 当作一个词法分析器来使用,然后“半递归”地构建 AST 来实现这一点。这种半递归是通过使用一个要解析的语句队列来完成的,然后逐个解析它们,而表达式是递归解析的。这允许解析器非常快,因为它在递归下降解析器的速度和 PEG 解析器的速度之间取得了平衡。递归是安全的,因为它不会导致堆栈溢出,因为如果表达式非常深,调用栈会自动扩展到堆中,多亏了
stacker
crate(请参阅parser.rs
中的parse_expr
函数)。访问者使用相同的队列和递归策略,因此它们也非常快。 - 它包括注释,但这些注释仅装饰到语句中,而不是表达式。
- AST 存储在一个类似竞技场的结构中,因此在内存中非常紧凑,可以轻松地序列化和反序列化而不会产生巨大的开销。
使用示例
请参阅我正在工作的这个项目: lua-dataset-heuristics,我在其中使用这个 crate 解析大约 500,000 个 Lua 文件的大型数据集,并使用启发式方法对其进行评分。这个解析器用于解析文件,然后遍历 AST 以查找相关信息。所有文件仅处理几分钟,这显示了此解析器的速度有多快。
当前状态
- AST [完成]
- 解析器 [完成]
- 通过访问者遍历 AST [完成]
- 格式化输出 [尚未开始]
依赖关系
~4–6MB
~123K SLoC