Основной разбор с ном
Я совершенно новый для nom (и комбинаторы парсеров в целом). Я хочу проанализировать строки с плавающей точкой, используя что-то вроде этого:
named!(
get_four_floats<(f32, f32, f32, f32)>,
ws!(do_parse!(
r1: float
>> r2: float
>> r3: float
>> t: float
>> opt!(complete!(line_ending))
>> (r1, r2, r3, t)
))
);
Тем не менее, разбор строки с 4 float возвращает Incomplete(Size(1))
, Хотя анализ строки с 5 числами с плавающей запятой работает (я бы хотел, чтобы она действительно потерпела неудачу, но я предполагаю, что это другой вопрос).
Вот небольшой юнит-тест:
#[test]
fn failure_four_floats() {
assert!(Parser::get_four_floats(b"asd").is_err());
assert!(Parser::get_four_floats(b" 1.0 1.0 1.0 1.0 1.0").is_err());
assert!(Parser::get_four_floats(b" 1.0 1.0 1.a 1.0").is_err());
assert!(Parser::get_four_floats(b" | 1.0 1.0 1.0 1.0").is_err());
}
#[test]
fn success_four_floats() {
let values = vec![
("1.0 1.0 1.0 1.0", (1.0, 1.0, 1.0, 1.0)),
("\t123.0 --1.234 1.0 1.0 \t\t", (123.0, 1.234, 1.0, 1.0)),
(" 1.0 1.0 1.0 1.0", (1.0, 1.0, 1.0, 1.0)),
(" \t 1.0 1.0 1.0 -1.0", (1.0, 1.0, 1.0, -1.0)),
];
for (line, floats) in values {
let parse_res = Parser::get_four_floats(line.as_bytes());
assert!(parse_res.is_ok());
assert_eq!(parse_res.unwrap().1, floats);
}
}
Оба теста проваливаются при первом утверждении.