some combinators
This commit is contained in:
parent
8b677c037b
commit
90673854a1
1 changed files with 24 additions and 0 deletions
|
|
@ -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>;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue