#token #symbol #parse #parser #no-std

nightly no-std parze-declare

一个简洁、高效的解析器组合器

2个不稳定版本

0.2.0 2019年11月28日
0.1.0 2019年11月27日

#80 in #symbol


parze 中使用

MIT 许可证

12KB
279

crates.io crates.io

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 的分发受以下任一许可证的约束:

由用户自行决定。

无运行时依赖项