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

nightly panini_logic

解析器生成器。此包处理解析器生成器的逻辑。

1 个不稳定版本

使用旧的Rust 2015

0.0.0 2019年10月18日

#1#panini

MIT/Apache

345KB
6.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/LICENSE-2.0,或MIT许可证:http://opensource.org/licenses/MIT,任选其一。

依赖

~5–14MB
~172K SLoC