gpt4 book ai didi

rust - 使用 nom 解析整数总是导致 Incomplete

转载 作者:行者123 更新时间:2023-11-29 07:58:02 26 4
gpt4 key购买 nike

我尝试的一切都给我 Incomplete(Size(1))。我现在最好的猜测是:

named!(my_u64(&str) -> u64,
map_res!(recognize!(nom::digit), u64::from_str)
);

测试:

#[cfg(test)]
mod test {
#[test]
fn my_u64() {
assert_eq!(Ok(("", 0)), super::my_u64("0"));
}
}

有时在我的变体中(例如添加 complete!),如果我在末尾添加一个字符,我已经能够解析它。

我想为此得到一个有效的解析(最终我希望这将允许我为 u64 包装器类型创建一个解析器)但我想得到更大的图景掌握如何自己正确构建解析器。

最佳答案

截至nom 5.1.1组合解析器的方法从基于宏更改为基于函数,在 nom's author blog 中进行了更广泛的讨论。 .

伴随着这一变化而来的还有另一个变化——流式完整 解析器现在驻留在不同的模块中,您需要明确选择您需要的解析类型。大多数情况下,模块名称都有明显的区别。

保留了旧宏,但它们严格在流模式下工作。像 CompleteStr 这样的类型或 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);
}
}

关于rust - 使用 nom 解析整数总是导致 Incomplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51257031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com