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
每月下载量2,459
在11个crate中使用(通过nom-recursive)
5KB
72 行
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许可证第2版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任由您选择。
贡献
除非您明确表示,否则您有意提交的任何贡献,根据Apache-2.0许可证定义的工作内容,将按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~1.5MB
~35K SLoC