2个不稳定版本
0.2.0 | 2019年11月28日 |
---|---|
0.1.0 | 2019年11月27日 |
#80 in #symbol
在 parze 中使用
12KB
279 行
Parze 已弃用
请查看 chumsky,它是 Parze 的全新实现,具有更多功能、更好的性能和更简洁的 API。
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
示例)。
Nightly
Parze 的声明宏目前需要 nightly 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)
由用户自行决定。