如何有一个带可选终止分隔符的nom分隔符



我想用nom:解析这两个

[
   a, 
   b,  
   c
]
[
   a, 
   b,  
   c,
]

目前,我有这样的代码,它解析第一个而不是第二个(第一个函数是来自nom-docs的一个配方,它只解析空白(:

// https://github.com/Geal/nom/blob/main/doc/nom_recipes.md#wrapper-combinators-that-eat-whitespace-before-and-after-a-parser
fn ws<'a, F: 'a, O, E: ParseError<&'a str>>(
    inner: F,
) -> impl FnMut(&'a str) -> IResult<&'a str, O, E>
where
    F: Fn(&'a str) -> IResult<&'a str, O, E>,
{
    delimited(multispace0, inner, multispace0)
}
pub fn parse_list(input: &str) -> IResult<&str, Vec<&str>> {
    delimited(
        ws(tag("[")),
        separated_list0(
            ws(tag(",")),
            take_while1(|x| char::is_alphabetic(x) || x == '_'),
        ),
        ws(tag("]")),
    )(input)
}

我是新来的,对现行法规没有任何忠诚,所以可以告诉我我做错了。。。

谢谢!

这里有一个(可能是许多解决方案中的一个(。

只需将terminatedopt:一起使用

pub fn parse_list(input: &str) -> IResult<&str, Vec<&str>> {
    delimited(
        ws(tag("[")),
        terminated(
            separated_list0(
                ws(tag(",")),
                take_while1(|x| char::is_alphabetic(x) || x == '_'),
            ),
            opt(ws(tag(","))),
        ),
        ws(tag("]")),
    )(input)
}

相关内容

  • 没有找到相关文章

最新更新