1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年7月10日 |
---|
#14 在 #configured
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