parser cuts

This commit is contained in:
brevalferrari 2025-06-06 01:34:05 +02:00
parent 7460a14bc1
commit b03b0ef5ee

View file

@ -11,7 +11,7 @@ use nom::{
complete::{char, space1, usize},
streaming::one_of,
},
combinator::{all_consuming, opt, value},
combinator::{all_consuming, cut, opt, value},
error::{Error, ParseError},
multi::many0,
sequence::{delimited, preceded},
@ -53,7 +53,7 @@ where
input: &'a str,
) -> Result<TokenVec, Error<nom_locate::LocatedSpan<&'a str>>> {
debug!("parsing input \"{input}\"");
token_parser(self)
all_consuming(token_parser(self))
.parse_complete(LocatedSpan::new(input))
.finish()
.map(|(_, o)| o)
@ -81,7 +81,7 @@ where
many0(value((), char('#').and(take_till(|c| c == '\n'))).or(value((), space1))),
)
};
all_consuming(many0(delimited(
many0(delimited(
space_or_comment(),
alt((
Silence::parser().map(into_box),
@ -93,7 +93,7 @@ where
Slope::parser(parser).map(into_box),
)),
space_or_comment(),
)))
))
.map(Into::into)
}
@ -171,10 +171,12 @@ impl VariableChange {
move |i: I| {
preceded(
char('$'),
one_of(variables.as_ref().iter().collect::<String>().as_str()),
)
cut(
one_of(variables.as_ref().iter().collect::<String>().as_str())
.and(expression_parser(variables.as_ref()))
.map(|(name, change)| VariableChange(name, change))
.map(|(name, change)| VariableChange(name, change)),
),
)
.parse(i)
}
}
@ -212,7 +214,7 @@ impl Loop {
.map(LoopCount::Variable),
)))
.and(token_parser(parser)),
char(')'),
cut(char(')')),
)
.map(|(c, v)| Self(c.unwrap_or_default(), v))
.parse(input)
@ -237,7 +239,7 @@ impl Tuplet {
{
trace!("making the {} parser", type_name::<Self>());
|input| {
delimited(char('['), token_parser(parser), char(']'))
delimited(char('['), token_parser(parser), cut(char(']')))
.map(Self)
.parse(input)
}
@ -277,15 +279,15 @@ impl Slope {
let iter: std::vec::IntoIter<(String, VariableChange)> = slopes.into_iter();
delimited(
char('{'),
alt(iter
cut(alt(iter
.map(|(k, v)| {
Box::new(move |input: I| value(v.clone(), tag(k.as_str())).parse(input))
as Box<dyn Fn(I) -> IResult<I, VariableChange>>
})
.collect::<Vec<Box<dyn Fn(I) -> IResult<I, VariableChange>>>>()
.as_mut_slice())
.as_mut_slice()))
.and(token_parser(parser)),
char('}'),
cut(char('}')),
)
.map(|(i, v)| Self::new(i, v))
.parse(input)