Разобрать целое число с плавающей точкой, используя Nom
У Nom есть пример анализа числа с плавающей запятой:
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 ответ
Решение
Вы должны обернуть tag!(".")
с 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
потому что он не может решить, является ли следующий вход .