1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年7月10日

#14#configured

MIT 许可协议

13KB
211

nom_config

nom_config 是一个小的 crate,允许在携带解析配置的同时编写 nom 解析器组合器。

让我们看一个人为的例子。假设我们想要从输入中提取 "test" 标记,跳过 "skip" 并将 "test" 替换为我们事先不知道的东西(一个可配置的替换)。

首先,我们可以指定一个包含替换的结构体

#[derive(Debug, Clone, Copy)]
struct Config {
    replacement: &'static [u8],
}

现在,我们可以使用 named_with_config! 宏来选择 "test" 标记,并使用 config! 宏检索配置

named_with_config!(Config, test, do_parse!(cfg: config!() >> v: tag!(b"test") >> ({cfg.replacement})));

当您想使用不知道配置的解析器时,可以使用 lift_config!

named_with_config!(Config, tests<Vec<&[u8]>>, many0!(alt!(lift_config!(tag!("skip")) | test)));

您通常需要在出现此类错误时执行此操作

   = note: expected type `nom::IResult<nom_config::Configured<_, &[u8]>, nom_config::Configured<Config, &[u8]>, _>`
              found type `nom::IResult<nom_config::Configured<_, &[u8]>, &[u8], _>`

现在,您可以将解析器与输入和配置一起包装到 Configured 中进行调用

fn main() {
    let (_, result) = tests(Configured::new(Config { replacement: b"TEST" }, b"testskiptest")).unwrap();
    assert_eq!(result, vec!["TEST".as_bytes(), "skip".as_bytes(), "TEST".as_bytes()]);
}

如您所见,"test" 标记被替换为 "TEST",正如预期的那样。

您可以在 这里 找到完整的示例

许可协议

此 crate 在 MIT 许可协议下进行许可,与 nom 相同。有关详细信息,请参阅 LICENSE

状态

此 crate 是一个早期版本。它可能是不完整的,可能存在一些错误;也可能后来出现更好的 API。

依赖项

~1MB
~22K SLoC