使用nom crate,我正在尝试编写一个解析器,它可以i32
从 a 中识别带符号的数字String
,即可以将字符串-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)
适用于简单的字符串,但这不是我想要的。