16 个版本

0.7.0 2023 年 3 月 23 日
0.6.0 2021 年 8 月 31 日
0.5.0 2020 年 11 月 26 日
0.4.0 2020 年 4 月 1 日
0.1.18 2019 年 7 月 28 日

#2442 in 解析器实现

Download history • Rust 包仓库 428/week @ 2024-04-15 • Rust 包仓库 482/week @ 2024-04-22 • Rust 包仓库 639/week @ 2024-04-29 • Rust 包仓库 488/week @ 2024-05-06 • Rust 包仓库 440/week @ 2024-05-13 • Rust 包仓库 696/week @ 2024-05-20 • Rust 包仓库 481/week @ 2024-05-27 • Rust 包仓库 635/week @ 2024-06-03 • Rust 包仓库 470/week @ 2024-06-10 • Rust 包仓库 374/week @ 2024-06-17 • Rust 包仓库 485/week @ 2024-06-24 • Rust 包仓库 237/week @ 2024-07-01 • Rust 包仓库 387/week @ 2024-07-08 • Rust 包仓库 705/week @ 2024-07-15 • Rust 包仓库 726/week @ 2024-07-22 • Rust 包仓库 589/week @ 2024-07-29 • Rust 包仓库

每月下载量 2,430
12 个 crate 中使用 (直接使用 2 个)

MIT/Apache 许可

11KB
122

nom-packrat

nom 的 Packrat 解析扩展。

Actions Status Crates.io Docs.rs

要求

nom 必须是 5.0.0 或更高版本。nom-packrat 只能应用于函数式解析器。

使用

[dependencies]
nom-packrat = "0.7.0"

示例

use nom::character::complete::char;
use nom::IResult;
use nom_packrat::{init, packrat_parser, storage};

// Declare storage used by packrat_parser
storage!(String);

// Apply packrat_parser by custom attribute
#[packrat_parser]
pub fn parser(s: &str) -> IResult<&str, String> {
    let (s, x) = char('a')(s)?;
    Ok((s, x.to_string()))
}

fn main() {
    let input = "a";

    // Initialize before parsing
    init!();
    let result = parser(input);

    println!("{:?}", result);
}

性能

语法

<S> ::= <T> + <S> | <T> - <S> | <T>
<T> ::= ( <S> ) | a

输入

以下 8 个模式。第一个模式命名为 "pair 0",最后一个命名为 "pair 7"。

a
(a)
((a))
(((a)))
((((a))))
(((((a)))))
((((((a))))))
(((((((a)))))))

结果

  • original : 原始 nom 解析器
  • packrat : 所有带有 #[packrat_parser] 的解析器
  • packrat_opt: 只有带有 <T> 且带有 #[packrat_parser] 的解析器

这是一个边缘情况。原始解析器的执行时间呈指数增长。通过 Packrat 解析,时间变为线性。但是 Packrat 解析器比原始解析器消耗更多内存。

speed

memory

许可

根据以下之一许可

由您选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的任何旨在包含在作品中的贡献,都应以上述双重许可,不得附加任何其他条款或条件。

依赖项

~2.5MB
~56K SLoC