1 个不稳定版本
使用旧的 Rust 2015
0.0.0 | 2016年5月20日 |
---|
#4 在 #panini
在 char_classifier 中使用
190KB
4.5K SLoC
Panini •
一个快速、现代、可扩展的解析生成器。
正在进行中。作为一个 Rust 语法扩展的通用解析生成器。
表面上,Panini 的目标是易用性。在未来,它还将提供高级功能,而不会牺牲速度。
Panini 使用 gearley 进行 Earley 解析,可以处理所有上下文无关语法。如果你为一种语言编写语法,它将按预期工作。
动机
数月对解析算法的研究使我相信,Earley/Marpa 算法是许多目的的最佳解析工具。Earley 的算法简单、灵活且可扩展。然而,没有人制作出一个高级解析生成器,可以实现算法的全部潜力。因此,我决定自己制作一个。
语法描述的语法和语义
在如 Rust 这样的静态类型语言中,实现用户友好性更难。因此,Panini 提供了类型表达式和类型推断。表达式根据直观的规则进行类型化
表达式 | 自动类型 | 描述 |
---|---|---|
名称 |
名称类型 | 符号的使用。 |
() |
() | 空值表达式。 |
(A) |
A 类型 | 忽略多余的括号。 |
(A B) |
(A 类型, B 类型) | 分组两个或多个表达式。 |
项目* |
Vec<项目类型> | 重复零次或多次的序列。 |
项目+ |
Vec<项目类型> | 重复一次或多次的序列。 |
`A | B` | A 和 B 类型 |
禁止自动递归类型。
在语义上有错误的语法在编译时可能会产生警告,但永远不会产生关键错误。这些警告可能表明某些语义操作被忽略。
依赖图
以下库是为 Panini 创建的。
相关工作
在 Rust 中
- LALRPOP — 一个专注于易用性的 LR(1) 解析生成器。
- rust-lang 的 GLL — 一个解析框架。
- grammer with an E — 一个语法框架。
- Oak — 一个具有类型表达式的 PEG 解析生成器。
在其他语言中
- Marpa — 一个具有高级功能的 Earley 解析器(不是生成器)。用 literate C 和 Perl 编写。
- YAEP — 一个目前速度最快且内存使用最小的 Earley 解析器引擎。用 C 编写。
学术界
- OMeta — 一个具有超越解析的高级功能的 PEG 解析器。
- SPPF-Style Parsing From Earley Recognisers — Elizabeth Scott。
引用
我很乐意有一个超级快的通用解析器,但一些非常聪明的人40年来都无法解决这个问题。
—— ANTLR 的作者 Terence Parr
感谢
感谢 Jay Earley、Jeffrey Kegler、John Aycock、R. Nigel Horspool 和 Elizabeth Scott 在 Earley 解析领域的开创性工作。
特别感谢 CD PROJEKT RED、HAEVN、Kaśka Sochacka、sanah、Kwiat Jabłoni、Carbon Based Lifeforms 和 Solar Fields 提供令人惊叹的音乐,让编码变得更加有趣。
许可证
双许可,以兼容 Rust 项目。
许可协议为 Apache 许可证版本 2.0:https://apache.ac.cn/licenses/LICENSE-2.0,或 MIT 许可证:http://opensource.org/licenses/MIT,任选其一。
依赖项
~11–20MB
~260K SLoC