#parser-generator #grammar #panini #generation #handle #language #macro

nightly panini_codegen

解析生成器。此包处理 grammar 宏的代码生成。

1 个不稳定版本

使用旧的 Rust 2015

0.0.0 2016年5月20日

#2#panini


3 个crate中使用

MIT/Apache

145KB
3.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

In Rust

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

其他语言

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

学术界

引用

我很乐意有一个超级快的通用解析器,但一些极其聪明的人40年来都无法解决这个问题。

—— 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.0授权:[https://apache.ac.cn/licenses/LICENSE2.0](https://apache.ac.cn/licenses/LICENSE2.0),或者MIT许可证:[http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT),任选其一。

依赖项

~9-18MB
~224K SLoC