使用标称值的基本解析

时间:2019-01-24 10:26:40

标签: rust nom

我是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个浮点数的行会返回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 个答案:

没有答案