使用nom机箱,我试图编写一个解析器,它可以从String
中识别有符号的i32
数字,也就是说,可以将字符串-42
转换为i32
表示。
到目前为止,我已经得到了以下代码,但我无法解析负数:
use nom::types::CompleteStr;
use std::str::FromStr;
named!(
i32_parser<CompleteStr, i32>,
map_res!(nom::digit, |CompleteStr(s)| i32::from_str(s))
);
#[test]
fn parse_i32_positive() {
assert_eq!(
i32_parser(CompleteStr::from("42")),
Ok((CompleteStr::from(""), 42))
);
}
#[test]
fn parse_i32_negative() {
assert_eq!(
i32_parser(CompleteStr::from("-42")),
Ok((CompleteStr::from(""), -42))
);
}
我还尝试了以下方法,但出现了一个隐含的编译错误:
named!(
i32_parser<CompleteStr, i32>,
map_res!(alt!(char!('-') | nom::digit), |CompleteStr(s)| i32::from_str(s))
);
^ expected char, found struct `nom::types::CompleteStr`
有什么建议吗?或者用nom来实现这一点的更简单的方法?
我明确地希望用nom来实现这一点,因为我试图解析一个更复杂的结构。i32::from_str(s)
适用于简单的字符串,但这不是我想要的。
3条答案
按热度按时间carvr3hs1#
recognize!
宏可以帮助您。它返回解析后的输入字符串而不是解析器输出,然后可以像往常一样进行转换。例如:irlmq6kh2#
更新了现代非宏名称:
yyyllmsg3#
alt!(char!('-') | nom::digit)
“返回”一个字符,所以你的lambda需要接受一个字符作为参数,并且它可能是'-'
,所以在运行时调用i32::from_str
将会失败。与其在一个步骤中处理符号和数字,不如将问题分解为两部分,例如使用
do_parse
。