#解析生成器 #panini #语法 #处理 #框架 #

panini_common

解析生成器。此包处理Panini几个包的通用代码。

1 个不稳定版本

使用旧的Rust 2015

0.0.0 2019年5月29日

#3#panini


用于 enum_stream_codegen

MIT/Apache

3KB

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中的

  • LALRPOP — 一个专注于易用性的LR(1)解析生成器。
  • rust-lang的GLL — 一个解析框架。
  • Oak — 一个带有类型表达式的PEG解析生成器。

其他语言中的

  • 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 License 2.0 许可:[https://apache.ac.cn/licenses/LICENSE-2.0](https://apache.ac.cn/licenses/LICENSE-2.0),或 MIT 许可:[http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT),任选其一。

依赖项

~2MB
~46K SLoC