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)
|
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>;
|
pub type Parser<T> = fn(&mut Tokens) -> ParseResult<T>;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue