13 个不稳定版本 (5 个破坏性更新)
0.6.0 | 2024年5月20日 |
---|---|
0.5.2 | 2024年5月13日 |
0.4.3 | 2021年11月21日 |
0.3.1 | 2021年10月18日 |
0.1.1 | 2021年8月8日 |
#719 in 文本处理
每月下载量 142
用于 wgsl-parser
84KB
884 行
Gramatika
使用 Rust 编写解析器的最小工具包
动机
尽管在许多情况下非常强大且有用,但我发现解析器生成器有点繁琐,并且由于各种原因难以使用。另一方面,手动编写解析器需要大量的繁琐模板才能开始。
该项目试图在基于自动语法工具和面对空白 lib.rs
文件时令人恐惧的空白之间找到我的“金发姑娘地带”(您的里程可能会有所不同)。目前,它提供了一个非常简单的 lexer 生成器,一些方便的宏,以及一些由 syn 启发的基本解析原语——足以让您有一个良好的开始,并让您摆脱障碍。
状态
自从推出以来,这个 crate 已经发展得相当成熟,目前至少正在被一个真实世界的生产代码库使用:一个为 IDE 工具实现的 语言服务器协议实现 驱动的 WGSL 解析器。尽管如此,API 仍应被视为不稳定,并且可能在发布 1.0 版本之前在次要版本之间进行破坏性更改。
入门
有关教程和 API 概述的简要介绍可在 crate 级别文档 中找到。
您还可以探索此存储库中的两个完整工作、非平凡示例项目
-
examples/lox
是使用 Gramatika 的 derive 宏实现的 Lox 编程语言的解析器。 -
examples/lox_manual_impl
是一个解析器,它通过手动编写所有通常由 derive 宏生成的代码来手动实现 Gramatika 的特质。如果您对实现细节感兴趣,或者需要手动实现 Gramatika 的某些特质来覆盖特殊用例,这是一个很好的起点。
用例
Gramatika 适用于满足以下标准的语言:
-
文本可以无状态地被标记化——也就是说,特定的字符模式无论在语法树中的位置如何,都可以由相同的标记表示。
例如,XML 类型的语言不满足此条件,因为只有位于
<
和>
括号内(以及括号本身)的文本应该被标记化,其余文本应被视为字面“文本节点”。 -
语言可以使用具有一个前瞻标记和有限回溯的 LL(1) 或递归下降解析器进行解析。
尽管如此,Gramatika 的 API 足够灵活,通过一些额外的工作,它可以适应不严格满足这些标准的用例。如果您想使用 Gramatika 进行此类用例,并希望得到一些指导或建议,请随时联系。
依赖关系
~0.1–1.1MB
~16K SLoC