Используя ящик nom , я пытаюсь написать синтаксический анализатор, который может распознавать число i32
со знаком из 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)
работает для простых строк, но это не то, что я ищу.