22 个版本

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 日

#packrat 中排名 5

Download history 517/week @ 2024-03-14 490/week @ 2024-03-21 468/week @ 2024-03-28 451/week @ 2024-04-04 494/week @ 2024-04-11 453/week @ 2024-04-18 554/week @ 2024-04-25 562/week @ 2024-05-02 473/week @ 2024-05-09 587/week @ 2024-05-16 571/week @ 2024-05-23 653/week @ 2024-05-30 458/week @ 2024-06-06 432/week @ 2024-06-13 442/week @ 2024-06-20 329/week @ 2024-06-27

每月下载 1,789
13 个库中使用 (通过 nom-packrat)

MIT/Apache 协议

7KB
114

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 许可证的定义,应按上述方式双授权,不附加任何额外条款或条件。

依赖关系

~1.5MB
~35K SLoC