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

Download history 6290/week @ 2024-03-14 7631/week @ 2024-03-21 6433/week @ 2024-03-28 6459/week @ 2024-04-04 8906/week @ 2024-04-11 9636/week @ 2024-04-18 11852/week @ 2024-04-25 7157/week @ 2024-05-02 6376/week @ 2024-05-09 8211/week @ 2024-05-16 7374/week @ 2024-05-23 11302/week @ 2024-05-30 14173/week @ 2024-06-06 15710/week @ 2024-06-13 17567/week @ 2024-06-20 11734/week @ 2024-06-27

61,416 每月下载量
23 个 crate 中使用 (通过 nom-derive)

MIT/Apache

91KB
2K SLoC

nom-derive

License: MIT Apache License 2.0 docs.rs Build Status Crates.io Version

概述

nom-derive 是一个自定义衍生属性,用于从结构定义中自动衍生 nom 解析器。

它不是为了取代 nom,而是为了提供一个快速简单的方式来生成结构的解析器,特别是简单的结构。这个 crate 的目标是简化常见情况。在某些情况下,手动编写解析器可能仍然更有效。

  • API 文档
  • docs::Nom 伪模块。这是 Nom 属性的主要文档,包含所有可能选项和许多示例。

欢迎反馈!

#[衍生(Nom)]

这个 crate 提供了一个自定义衍生宏 Nom,它为应用到的结构实现了 parse

这个项目的目标是

  • derive(Nom) 应该足以让你轻松地从简单结构中衍生 nom 解析器,而不必手动编写
  • 它允许你通过自己的方法覆盖任何解析方法
  • 它允许使用生成的解析函数与手动编写的解析器一起使用,并轻松地将它们组合起来
  • 它仍然和 nom 一样快

nom-derivenom 添加了声明式解析。它还允许轻松地与过程式解析混合,使编写字节编码格式的解析器变得非常简单。

例如

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.mdUPGRADING.md 了解升级主版本的说明。

许可证

根据您的要求,许可方式如下

任选其一。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,没有任何附加条款或条件。

依赖关系

~1.5MB
~35K SLoC