用 nom 解析整数总是导致不完整

2023-11-25

我尝试的一切都给了我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(使用前将#替换为@)

用 nom 解析整数总是导致不完整 的相关文章

随机推荐