我正在尝试用nom5传递一些锌格式的https://www.project-haystack.org/doc/Zinc
数字格式可以类似于以下任何格式
1,-34,10_000,5.4e-45,-5.4e-45,9.23 34,74.2°F,4分钟,INF,-INF,NaN
我相信单位可以是任何指定的单位。
我有一些简单的数字传递的例子,比如Parsing number with nom 5.0
fn number<'a>(i: &'a str) -> IResult<&'a str, Token, (&'a str, ErrorKind)> {
map(
tuple((
opt(char('-')),
many1(digit1),
opt(preceded(char('.'), many1(digit1)))
)),
|s| Token::Number(s)
)(i)
}但我不确定如何处理这些值,可能也是INF或-INF,NaN,以及可能添加的单位。
在nom中我该如何处理这种情况?
谢谢
发布于 2020-06-18 23:59:25
最后我把它建得像这样
fn simple_number<'a>(i: &'a str) -> IResult<&'a str, Token, (&'a str, ErrorKind)> {
map(
recognize(tuple( (opt(alt((char('-'), char('+')))), many1(digit1), opt(preceded(char('.'), many1(digit1)))) ) ),
|s: &str| Token::Number(s.parse::<f64>().unwrap(), "".into())
//|s: &str| Token::Var(s.into())
)(i)
}
fn exponent<'a>(i: &'a str) -> IResult<&'a str, Token, (&'a str, ErrorKind)> {
map(
recognize(tuple( ( alt((char('e'), char('E'))), simple_number )) ),
|s: &str| Token::Var(s.into())
)(i)
}
fn number<'a>(i: &'a str) -> IResult<&'a str, f64, (&'a str, ErrorKind)> {
map(
recognize(tuple((simple_number, opt(exponent))) ),
|s: &str| s.parse::<f64>().unwrap()
)(i)
}
fn units<'a>(i: &'a str) -> IResult<&'a str, &'a str, (&'a str, ErrorKind)> {
alphanumeric1(i)
}
fn number_with_unit<'a>(i: &'a str) -> IResult<&'a str, Token, (&'a str, ErrorKind)> {
map(
tuple((number, opt(units))),
|t: (f64, Option<&str>)| Token::Number(t.0, t.1.unwrap_or(&"".to_string()).into())
)(i)
}
// Number: 1, -34, 5.4, -5.4, 9.23, 74.2, 4, 5.4e-45, -5.4e-45, 67.3E7 INF -INF +INF NAN
fn zinc_number<'a>(i: &'a str) -> IResult<&'a str, Token, (&'a str, ErrorKind)> {
alt( (number_with_unit, inf, nan) ) (i)
}https://stackoverflow.com/questions/62448068
复制相似问题