some combinators

This commit is contained in:
me 2025-12-16 00:07:36 +02:00
parent 8b677c037b
commit 90673854a1

View file

@ -63,6 +63,30 @@ impl Tokens {
}
Ok(None)
}
pub fn sep_by<T1, T2>(
&mut self,
separator: Token,
parser1: Parser<T1>,
parser2: Parser<T2>,
) -> ParseResult<(T1, T2)> {
if let Some(t1) = parser1(self)? {
let _sep = self.next_if(separator).ok_or(Error::UnexpectedEndOfInput)?;
if let Some(t2) = parser2(self)? {
Ok(Some((t1, t2)))
} else {
Err(Error::UnexpectedTokenForParser)
}
} else {
Ok(None)
}
}
pub fn many<T>(&mut self, parser: Parser<T>) -> ParseResult<Vec<T>> {
let mut results = vec![];
while let Some(result) = parser(self)? {
results.push(result);
}
Ok(Some(results))
}
}
pub type Parser<T> = fn(&mut Tokens) -> ParseResult<T>;