20个版本
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.4.0 | 2019年3月6日 |
#7 in 解析器工具
67,891 每月下载量
用于 23 个crate (14 个直接使用)
69KB
456 行
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》或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在您的工作中的贡献,将根据上述内容双重许可,无需任何附加条款或条件。
依赖项
约2.5MB
约55K SLoC