如何使用可选的终止分隔符在 nom 中设置分隔符?
How to have a separator in nom with an optional terminating separator?
我想用 nom 解析这两个:
[
a,
b,
c
]
[
a,
b,
c,
]
目前我有解析第一个但不解析第二个的代码(第一个函数是来自 nom 文档的配方,它只解析空白):
// 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)
}
我是 nom 的新手,对当前代码没有任何忠诚度,很高兴告诉我我做错了...
谢谢!
这是一个(可能有很多解决方案)。
只需使用terminated
along with opt
:
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)
}
我想用 nom 解析这两个:
[
a,
b,
c
]
[
a,
b,
c,
]
目前我有解析第一个但不解析第二个的代码(第一个函数是来自 nom 文档的配方,它只解析空白):
// 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)
}
我是 nom 的新手,对当前代码没有任何忠诚度,很高兴告诉我我做错了...
谢谢!
这是一个(可能有很多解决方案)。
只需使用terminated
along with opt
:
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)
}