为什么 nom 在我传递 CompleteStr 时期望 &str?



解析器按预期工作,直到我想解析h:数字,它总是字符串中的最后一个数字,并且编译器给我

^ expected &str, found struct `nom::types::CompleteStr`

我想这是因为解析器正在向前看。我该如何阻止它,或者我该如何表示它已经完成?

#[macro_use]
extern crate nom;
use nom::digit;
use nom::types::CompleteStr;
use std::str::FromStr;
#[derive(Debug, PartialEq)]
pub struct Order {
pub l: u64,
pub w: u64,
pub h: u64,
}
named!(order_parser<CompleteStr, Order>,
do_parse!(
l: map_res!(digit, u64::from_str) >>
tag!("x") >>
w: map_res!(digit, u64::from_str) >>
tag!("x") >>
h: map_res!(digit, u64::from_str) >>
(Order {l:  l, w: w, h: h })
)
);
pub fn wrap_order(order: &str) -> Result<(CompleteStr, Order), nom::Err<&str>> {
order_parser(order)
}
#[test]
fn test_order_parser() {
assert_eq!(
wrap_order(CompleteStr("2x3x4")),
Ok((CompleteStr(""), Order { l: 2, w: 3, h: 4 }))
);
}

错误不在最后一个数字解析器上,而是在每个解析器上(Rust 1.30.0将错误打印三次(。这是因为u64::from_str&str上工作,而不是在CompleteStr上工作。

您可以通过以下方式修复解析器以正确使用u64::from_str

do_parse!(
l: map_res!(digit, |CompleteStr(s)| u64::from_str(s)) >>
tag!("x") >>
w: map_res!(digit, |CompleteStr(s)| u64::from_str(s)) >>
tag!("x") >>
h: map_res!(digit, |CompleteStr(s)| u64::from_str(s)) >>
(Order { l: l, w: w, h: h })
)

下一个函数也有一些不相关的错误,可以通过在签名中使用适当的类型来修复:

pub fn wrap_order(order: &str) -> Result<(CompleteStr, Order), nom::Err<CompleteStr>> {
order_parser(CompleteStr(order))
}

相关内容

  • 没有找到相关文章

最新更新