#parser-generator #advanced #extensible #grammar #offers #speed #ease

nightly enum_stream_codegen

一个解析器生成器。此包处理enum_stream宏的代码生成。

2个不稳定版本

使用旧的Rust 2015

0.1.0 2019年5月29日
0.0.0 2016年5月20日

#560 in 过程宏


3 个Crates中(直接使用2个)中使用

MIT/Apache

23KB
562 代码行

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 License Version 2.0 许可下发布:https://apache.ac.cn/licenses/LICENSE-2.0,或根据您选择,在 MIT 许可下发布:http://opensource.org/licenses/MIT

依赖关系

~4–13MB
~150K SLoC