我尝试的一切都给了我Incomplete(Size(1))
。我现在最好的猜测是:
named!(my_u64(&str) -> u64,
map_res!(recognize!(nom::digit), u64::from_str)
);
Test:
#[cfg(test)]
mod test {
#[test]
fn my_u64() {
assert_eq!(Ok(("", 0)), super::my_u64("0"));
}
}
有时在我的变体中(例如添加complete!
)如果我在末尾添加一个字符,我就能够解析它。
我想为此获得一个有效的解析器(最终我希望这将允许我为u64
包装器类型)但更大的图景我想了解如何自己正确构建解析器。
As of nom 5.1.1
组合解析器的方法从基于宏的变为基于函数的,这在nom 的作者博客.
随着这一变化,另一个变化也随之而来——流媒体 and complete解析器现在驻留在不同的模块中,您需要显式选择所需的解析类型。大多数情况下,模块名称有明显的区别。
旧的宏被保留,但它们严格在流模式下工作。类型如CompleteStr
or CompleteByteSlice
消失了。
编写您要求的代码新方法你可以这样做,例如像这样(明确通知character::complete
在进口中)
因为我花了一些时间来掌握它 - 解析器例如map_res
返回一个impl Fn(I) -> IResult<I, O2, E>
这就是为什么有额外的一对括号 - 称为闭包。
use std::str;
use nom::{
IResult,
character::complete::{
digit1
},
combinator::{
recognize,
map_res
}
};
fn my_u64(input : &str) -> IResult<&str, u64> {
map_res(recognize(digit1), str::parse)(input)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_my_u64() {
let input = "42";
let num = my_u64(input);
assert_eq!(Ok(("", 42u64)), num);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)