6个版本 (破坏性更新)

0.5.1 2024年3月28日
0.5.0 2023年3月23日
0.4.0 2021年8月31日
0.3.0 2020年11月26日
0.1.1 2019年8月15日

#packrat 中排名第4

Download history 440/week @ 2024-04-15 490/week @ 2024-04-22 645/week @ 2024-04-29 499/week @ 2024-05-06 423/week @ 2024-05-13 775/week @ 2024-05-20 523/week @ 2024-05-27 673/week @ 2024-06-03 514/week @ 2024-06-10 401/week @ 2024-06-17 494/week @ 2024-06-24 229/week @ 2024-07-01 396/week @ 2024-07-08 710/week @ 2024-07-15 733/week @ 2024-07-22 599/week @ 2024-07-29

每月下载量2,459
11个crate中使用(通过nom-recursive

MIT/Apache

5KB
72

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