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 解析器工具

Download history 9350/week @ 2024-04-19 12210/week @ 2024-04-26 6119/week @ 2024-05-03 7274/week @ 2024-05-10 8361/week @ 2024-05-17 7668/week @ 2024-05-24 12364/week @ 2024-05-31 14608/week @ 2024-06-07 15934/week @ 2024-06-14 18565/week @ 2024-06-21 11851/week @ 2024-06-28 15110/week @ 2024-07-05 14461/week @ 2024-07-12 14784/week @ 2024-07-19 17070/week @ 2024-07-26 18488/week @ 2024-08-02

67,891 每月下载量
用于 23 个crate (14 个直接使用)

MIT/Apache

69KB
456

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许可证定义的,任何有意提交以包含在您的工作中的贡献,将根据上述内容双重许可,无需任何附加条款或条件。

依赖项

约2.5MB
约55K SLoC