5 个不稳定版本
0.10.1 | 2023年3月20日 |
---|---|
0.10.0 | 2021年9月13日 |
0.9.1 | 2021年8月7日 |
0.9.0 | 2021年6月8日 |
0.8.0 | 2021年4月22日 |
#181 在 #nom
61,416 每月下载量
在 23 个 crate 中使用 (通过 nom-derive)
91KB
2K SLoC
nom-derive
概述
nom-derive 是一个自定义衍生属性,用于从结构定义中自动衍生 nom 解析器。
它不是为了取代 nom,而是为了提供一个快速简单的方式来生成结构的解析器,特别是简单的结构。这个 crate 的目标是简化常见情况。在某些情况下,手动编写解析器可能仍然更有效。
欢迎反馈!
#[衍生(Nom)]
这个 crate 提供了一个自定义衍生宏 Nom
,它为应用到的结构实现了 parse
。
这个项目的目标是
derive(Nom)
应该足以让你轻松地从简单结构中衍生 nom 解析器,而不必手动编写- 它允许你通过自己的方法覆盖任何解析方法
- 它允许使用生成的解析函数与手动编写的解析器一起使用,并轻松地将它们组合起来
- 它仍然和 nom 一样快
nom-derive
为 nom
添加了声明式解析。它还允许轻松地与过程式解析混合,使编写字节编码格式的解析器变得非常简单。
例如
use nom_derive::*;
#[derive(Nom)]
struct S {
a: u32,
b: u16,
c: u16
}
这为 S
添加了静态方法 parse
。生成的代码看起来像
impl S {
pub fn parse(i: &[u8]) -> nom::IResult(&[u8], S) {
let (i, a) = be_u32(i)?;
let (i, b) = be_u16(i)?;
let (i, c) = be_u16(i)?;
Ok((i, S{ a, b, c }))
}
}
要解析输入,只需调用 let res = S::parse(input);
即可。
有关所有属性和示例的详细文档,请参阅 docs::Nom 自定义派生属性的文档。
提供了许多示例,更多可以在 项目测试 中找到。
组合器可见性
所有推断的解析器都会生成带有绝对类型路径的代码,因此无需为它们添加 use
语句。然而,如果您直接使用任何组合器(或在 Parse
语句中,例如),则必须像通常一样导入。
这可能不会改变,因为
- proc_macro 不能导出除函数外标记有
#[proc_macro_derive]
的项目 - 由于存在具有相同名称的组合器变体(完整/流式传输,位/字节),因此重新导出它们将产生副作用。
调试技巧
- 如果生成的解析器无法编译,请在结构中添加
#[nom(DebugDerive)]
。它将生成的解析器转储到stderr
。 - 如果生成的解析器在运行时失败,请尝试在结构或字段中添加
#[nom(Debug)]
。它将子解析器包装在dbg_dmp
中,如果解析器失败,将在stderr
中打印字段名称和输入。
更改
请参阅 CHANGELOG.md
和 UPGRADING.md
了解升级主版本的说明。
许可证
根据您的要求,许可方式如下
- Apache License,版本 2.0 (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