From 90673854a13d26494bdc411e893e56f2002a1231 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 16 Dec 2025 00:07:36 +0200 Subject: [PATCH] some combinators --- src/parser/types.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/parser/types.rs b/src/parser/types.rs index 01596bc..151e8d9 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -63,6 +63,30 @@ impl Tokens { } Ok(None) } + pub fn sep_by( + &mut self, + separator: Token, + parser1: Parser, + parser2: Parser, + ) -> 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(&mut self, parser: Parser) -> ParseResult> { + let mut results = vec![]; + while let Some(result) = parser(self)? { + results.push(result); + } + Ok(Some(results)) + } } pub type Parser = fn(&mut Tokens) -> ParseResult;