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;