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

MIT 许可证

51KB
928

crates.io crates.io

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 在用户的决定下,可以根据以下任一许可证分发

由用户决定。

依赖项