#parser-generator #grammar #panini #syntax #extension #framework #enum-stream

nightly panini_macros

解析生成器。本包声明了两种语法扩展:grammarenum_stream

1 个不稳定版本

使用旧的 Rust 2015

0.0.0 2016年5月20日

#4#panini


char_classifier 中使用

MIT/Apache

190KB
4.5K SLoC

Panini • 最新版本

logo of panini

一个快速、现代、可扩展的解析生成器。

正在进行中。作为一个 Rust 语法扩展的通用解析生成器。

表面上,Panini 的目标是易用性。在未来,它还将提供高级功能,而不会牺牲速度。

Panini 使用 gearley 进行 Earley 解析,可以处理所有上下文无关语法。如果你为一种语言编写语法,它将按预期工作。

动机

数月对解析算法的研究使我相信,Earley/Marpa 算法是许多目的的最佳解析工具。Earley 的算法简单、灵活且可扩展。然而,没有人制作出一个高级解析生成器,可以实现算法的全部潜力。因此,我决定自己制作一个。

语法描述的语法和语义

在如 Rust 这样的静态类型语言中,实现用户友好性更难。因此,Panini 提供了类型表达式和类型推断。表达式根据直观的规则进行类型化

表达式 自动类型 描述
名称 名称类型 符号的使用。
() () 空值表达式。
(A) A 类型 忽略多余的括号。
(A B) (A 类型, B 类型) 分组两个或多个表达式。
项目* Vec<项目类型> 重复零次或多次的序列。
项目+ Vec<项目类型> 重复一次或多次的序列。
`A B` A 和 B 类型

禁止自动递归类型。

在语义上有错误的语法在编译时可能会产生警告,但永远不会产生关键错误。这些警告可能表明某些语义操作被忽略。

依赖图

以下库是为 Panini 创建的。

Dependency graph

在 Rust 中

在其他语言中

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

学术界

引用

我很乐意有一个超级快的通用解析器,但一些非常聪明的人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