Основной разбор с ном

Я совершенно новый для 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);
    }
}

Оба теста проваливаются при первом утверждении.

0 ответов

Другие вопросы по тегам