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
每月下载 1,789 次
在 13 个库中使用 (通过 nom-packrat)
7KB
114 行
nom-packrat
nom 的 "Packrat 解析" 扩展。
要求
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 解析器比原始解析器消耗更多的内存。
许可证
根据以下其中一项授权
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则任何旨在包含在作品中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双授权,不附加任何额外条款或条件。
依赖关系
~1.5MB
~35K SLoC