13 个版本 (6 个破坏性更新)
0.7.3 | 2019年11月29日 |
---|---|
0.7.2 | 2019年11月29日 |
0.6.0 | 2019年11月27日 |
0.5.1 | 2019年11月27日 |
0.1.0 | 2019年11月25日 |
#122 在 解析器工具
每月下载量 37
51KB
928 行
Parze
Parze 是一个由 Rust 编写的干净、高效的解析器组合器。
示例
一个能够将所有有效的 Brainfuck 代码解析成 AST 的解析器。
use parze::prelude::*;
#[derive(Clone, Debug, PartialEq)]
enum Instr { Add, Sub, Left, Right, In, Out, Loop(Vec<Instr>) }
parsers! {
bf = {
( '+' -> { Instr::Add }
| '-' -> { Instr::Sub }
| '<' -> { Instr::Left }
| '>' -> { Instr::Right }
| ',' -> { Instr::In }
| '.' -> { Instr::Out }
| '[' -& bf &- ']' => { |i| Instr::Loop(i) }
) *
}
}
特性
- 所有常规的解析器组合器操作
- 简单规则和解析器声明的宏
- 支持递归解析器定义
- 自定义错误类型 - 定义自己的!
- 优先/合并失败以获得更有用的错误
- 无依赖 - 快速编译!
-
no_std
支持
为什么选择 Parze?
Parze 快速且轻量,作为一个基础框架,可以构建更详细和有趣的解析器(请参阅 custom_error
示例)。
夜间
Parze 的声明宏目前需要夜间 Rust 编译器才能工作。您可以通过禁用 nightly
功能,使用显式声明形式(如下所示)与稳定版本一起使用。
这可以在您的 Cargo.toml
中这样做
[dependencies.parze]
version = "x.y.z"
default-features = false
性能
以下是与 pom
相比时的 JSON 解析测试结果。稍后会有更多的性能指标。
test parze ... bench: 3,696,323 ns/iter (+/- 358,597)
test pom ... bench: 18,538,775 ns/iter (+/- 1,149,589)
显式形式
虽然 Parze 鼓励使用宏来处理大部分声明性记法,但可以使用更明确的 rust-y 记法(这通常是可能的并且很有用)。
以下是上面给出的 Brainfuck 解析器,以显式形式声明。
let bf: Parser<_, _> = recursive(|bf| (
sym('+').to(Instr::Add)
.or(sym('-').to(Instr::Sub))
.or(sym('<').to(Instr::Left))
.or(sym('>').to(Instr::Right))
.or(sym(',').to(Instr::In))
.or(sym('.').to(Instr::Out))
.or(sym('[').delimiter_for(bf).delimited_by(sym(']')).map(|i| Instr::Loop(i)))
).repeat(..));
许可证
Parze 在用户的决定下,可以根据以下任一许可证分发
-
Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
-
MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由用户决定。