#parser-generator #grammar #panini #framework #package #macro

nightly char_classifier

解析生成器。本包实现了 char_classifier 宏。

1 个不稳定版本

使用旧的 Rust 2015

0.0.0 2016年5月20日

#5#panini

MIT/Apache

185KB
4.5K SLoC

Panini • 最新版本

logo of 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 创建的。

Dependency graph

在 Rust 中

其他语言

  • Marpa — 一个具有高级功能的 Earley 解析器(不是生成器)。用 literate C 和 Perl 编写。
  • YAEP — 一个目前速度最快、内存使用最小的 Earley 解析器引擎。用 C 编写。

学术界

引言

我很高兴能有一个超快的通用解析器,但一些极其聪明的大脑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