1 个不稳定版本
使用旧的 Rust 2015
0.0.0 | 2016年5月20日 |
---|
#5 在 #panini
185KB
4.5K SLoC
Panini •
一个快速的、现代的、可扩展的解析生成器。
正在开发中。一个通用解析生成器作为 Rust 语法扩展。
表面上,Panini 的目标是易于使用。未来,它还将提供高级功能,而不牺牲速度。
Panini 使用 gearley 进行 Earley 解析,可以处理所有上下文无关文法。如果你为一种语言编写文法,它将按预期工作。
动机
几个月对解析算法的研究使我相信,Earley/Marpa 算法是许多用途的最佳解析工具。Earley 算法简单、灵活且可扩展。遗憾的是,没有人制作出一个能够实现算法全部潜力的高级解析生成器。因此我决定自己制作一个。
语法描述的语法和语义
在静态类型语言(如 Rust)中实现用户友好性更为困难。因此,Panini 提供了类型表达式和类型推断。表达式根据直观的规则进行类型化
表达式 | 自动类型 | 描述 |
---|---|---|
name |
name 的类型 | 符号的使用。 |
() |
() | 一个空表达式。 |
(A) |
A 的类型 | 忽略多余的括号。 |
(A B) |
(A 的类型, B 的类型) | 将两个或多个表达式分组。 |
item* |
Vec<item 的类型> | 重复零次或多次的序列。 |
item+ |
Vec<item 的类型> | 重复一次或多次的序列。 |
`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/LICENSE-2.0 或 MIT 许可证:http://opensource.org/licenses/MIT。
依赖项
~8–18MB
~217K SLoC