首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析nom中的数字

解析nom中的数字
EN

Stack Overflow用户
提问于 2020-06-18 18:39:31
回答 1查看 257关注 0票数 0

我正在尝试用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

代码语言:javascript
复制
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中我该如何处理这种情况?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 23:59:25

最后我把它建得像这样

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62448068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档