使用Nom将整数解析为float

时间:2017-03-14 15:45:47

标签: rust nom

Nom有example of parsing a floating point number

named!(unsigned_float <f32>, map_res!(
  map_res!(
    recognize!(
      alt!(
        delimited!(digit, tag!("."), opt!(complete!(digit))) |
        delimited!(opt!(digit), tag!("."), digit)
      )
    ),
    str::from_utf8
  ),
  FromStr::from_str
));

我想扩展此示例以支持将"123"解析为123.0。我尝试过这样的事情没有运气:

named!(unsigned_float_v1 <f32>,
    map_res!(
        map_res!(
            alt!(
                recognize!(
                    alt!(
                        delimited!(digit, tag!("."), opt!(complete!(digit))) |
                        delimited!(opt!(digit), tag!("."), digit)
                    )
                ) |
                ws!(digit)
            ),
            str::from_utf8
        ),
        FromStr::from_str
    )
);

named!(unsigned_float_v2 <f32>,
    map_res!(
        map_res!(
            recognize!(
                alt!(
                    delimited!(digit, tag!("."), opt!(complete!(digit))) |
                    delimited!(opt!(digit), tag!("."), digit) |
                    digit
                )
            ),
            str::from_utf8
        ),
        FromStr::from_str
    )
);

1 个答案:

答案 0 :(得分:1)

您还需要将@NotNulltag!(".")一起打包,如下所示:

complete!

如果输入为named!(unsigned_float_v2 <f32>, map_res!( map_res!( recognize!( alt!( delimited!(digit, complete!(tag!(".")), opt!(complete!(digit))) | delimited!(opt!(digit), complete!(tag!("."), digit) | digit ) ), str::from_utf8 ), FromStr::from_str ) ); 123将返回tag!,因为它无法确定下一个输入是否为Incomplete