1 个不稳定版本
使用旧的Rust 2015
0.0.0 | 2016年5月20日 |
---|
#175 在 #parser-generator 中
用于 3 crate
6KB
116 行
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年了。
—— Terence Parr,ANTLR 作者
感谢
感谢 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 版许可:[https://apache.ac.cn/licenses/LICENSE2.0](https://apache.ac.cn/licenses/LICENSE2.0),或 MIT 许可证:[https://open-source.org.cn/licenses/MIT](https://open-source.org.cn/licenses/MIT),由您选择。
依赖项
约 4–12MB
约 130K SLoC