#ast #luau #lua #ast-parser #roblox #parser

bin+lib luau-ast-rs

用 Rust 编写的 Luau 和 Lua5.1 解析器和 AST

28 个版本

0.1.29 2023 年 8 月 2 日
0.1.28 2023 年 7 月 30 日
0.1.22 2023 年 6 月 27 日

游戏 中排名第 113

Download history 3/week @ 2024-05-21 51/week @ 2024-07-02 161/week @ 2024-07-30

每月下载量 161

MIT 许可证

290KB
7.5K SLoC

用 Rust 编写的 Luau 和 Lua5.1 解析器和 AST

这是一个基于 tree-sitter 的 Luau 和 Lua5.1 解析器,用 Rust 编写。使用的语法是 polychromatist/tree-sitter-luau 的分支。

这个 crate 的目标是提供一个 完整快速 的 Luau 解析器,同时提供格式化和 AST 遍历工具。

为什么我会创建这个,它与其他解析器有什么不同?

  1. 主要原因:它具有错误容忍性。AST 是按语句分割的,因此如果某个语句中存在错误,其他 AST 仍然会被生成并可以遍历。
  2. 它速度快、内存效率高,并且是 线程安全的,这意味着它可以用来并行处理大量 Lua 文件。我通过将 tree-sitter 当作一个词法分析器来使用,然后“半递归”地构建 AST 来实现这一点。这种半递归是通过使用一个要解析的语句队列来完成的,然后逐个解析它们,而表达式是递归解析的。这允许解析器非常快,因为它在递归下降解析器的速度和 PEG 解析器的速度之间取得了平衡。递归是安全的,因为它不会导致堆栈溢出,因为如果表达式非常深,调用栈会自动扩展到堆中,多亏了 stacker crate(请参阅 parser.rs 中的 parse_expr 函数)。访问者使用相同的队列和递归策略,因此它们也非常快。
  3. 它包括注释,但这些注释仅装饰到语句中,而不是表达式。
  4. AST 存储在一个类似竞技场的结构中,因此在内存中非常紧凑,可以轻松地序列化和反序列化而不会产生巨大的开销。

使用示例

请参阅我正在工作的这个项目: lua-dataset-heuristics,我在其中使用这个 crate 解析大约 500,000 个 Lua 文件的大型数据集,并使用启发式方法对其进行评分。这个解析器用于解析文件,然后遍历 AST 以查找相关信息。所有文件仅处理几分钟,这显示了此解析器的速度有多快。

当前状态

  • AST [完成]
  • 解析器 [完成]
  • 通过访问者遍历 AST [完成]
  • 格式化输出 [尚未开始]

依赖关系

~4–6MB
~123K SLoC