#pest-parser #pest-grammar #parser-generator #optimization #low-level #expression #compatible

faster-pest

高性能 Pest 解析器的生成器,将你的语法提升到下一个层次

6 个版本

0.2.0-alpha.12024 年 5 月 31 日
0.1.4 2023 年 6 月 30 日
0.1.3 2023 年 4 月 29 日
0.1.2 2023 年 1 月 13 日

#138性能分析 中排名

每月 35 次下载
2 个库中使用(通过 kodept-parse

GPL-3.0-or-later

425KB
405

更快的 Pest

欢迎来到 faster-pest,这是一个用于 解析表达式语法 的高性能代码生成器。 faster-pest 是一个非官方的 pro-macro,提供了 Pest 解析器的下一级实现。它使用底层优化技巧来生成高度优化的代码,从而最小化 AST 识别过程的开销,从而实现更快的解析。

faster-pest 与标准的 Pest 语法 兼容,因此你可以轻松切换到它,而无需更改现有的语法。

使用 faster-pest,你可以享受 Pest 的便利性和表达性,同时获得底层解析库的性能。试一试,亲自体验其中的不同!

底层使用的解析方法与原始 pest 代码没有任何共同之处。说实话,我从没看过 pest 代码库,因为从头开始更容易。还有一件事没有被重写:实际 pest 语法的解析。然而,这可能不会持续太久。我需要扩展语法以实现更多高级技巧,例如使用 Rust 代码定义复杂的规则并在 pest 语法中导入它们。

基准测试

在创建仅一周后,faster-pest 已经解析 Json 的速度比 Pest 快 705%,比 Nom 快 137%。这使得 faster-pestserde_json 相当。 faster-pest 允许你接近只有 SIMD 驱动的解析器才能克服的限制。

自己进行基准测试

示例

请参阅 示例文件夹 中的示例。

它包含了来自《Pest书籍》的两个示例:csvini
它们使用了与《Pest书籍》中完全相同的代码,表明 faster-pest 是 Pest 的直接替代品。

如果你没有任何遗留的 Pest 代码库,建议不要使用 pest 兼容层。请参考其他两个示例:jsonpo
这些是使用 faster-pest 最有效和最符合惯例的方式。它们的工作方式与 pest 兼容层相似,但其实现更为优雅。

局限性

faster-pest 仍然处于开发的早期阶段,因此它有一些局限性。以下是最重要的几个

  • 有限的语法支持(缺少:stack、insens、pospred)
  • 不支持 Pest 的标记符 API(你可能没有使用过)
  • 错误打印是为 Linux 制作的
  • 当重复提前结束时,错误可能会变得难以理解
  • 并非所有内容都已测试,可能会有错误的解析行为

优化技巧(供好奇的人)

  • faster-pest 为每个存在的解析组件生成了两个版本。一个版本具有错误支持,另一个没有。由于错误支持会被立即丢弃(例如,在失败的分支中),所以有许多地方不需要错误支持。 faster-pest 只在解析完全失败时检索错误,因此任何有效输入都只会导致调用完全无错误的代码。从开发者的角度来看,这种优化是完全透明的。
  • 有时将规则组合并为一个单一的规则,而 pest 则将它们分开
  • 简单的字符规则重复使用迭代器适配器而不是循环
  • 绕过了所有不必要的检查
  • 批量分配,这使得它们相对分散
  • 代码非常小,很可能经常被编译器内联
  • 解析本身是完全零拷贝的
  • 遍历解析标识符几乎是免费的

许可证:GPL-3.0

依赖关系

~3.5MB
~74K SLoC