use crate::BoxDynLexerParseFn;
use crate::Lexer;
pub struct ParserIterator<'a, L>
where
L: Lexer,
{
lexer: &'a L,
state: L::State,
parsers: &'a [BoxDynLexerParseFn<'a, L>],
}
impl<'a, L> ParserIterator<'a, L>
where
L: Lexer,
{
pub fn new(lexer: &'a L, state: L::State, parsers: &'a [BoxDynLexerParseFn<'a, L>]) -> Self {
Self {
lexer,
state,
parsers,
}
}
}
impl<'a, L> Iterator for ParserIterator<'a, L>
where
L: Lexer,
{
type Item = Result<L::Token, L::Error>;
fn next(&mut self) -> Option<Self::Item> {
match self.lexer.parse(self.state, self.parsers) {
Err(e) => Some(Err(e)),
Ok(Some((state, token))) => {
self.state = state;
Some(Ok(token))
}
_ => None,
}
}
}