in smt2parser/src/lib.rs [105:141]
fn next(&mut self) -> Option<Result<T::Command, T::Error>> {
let mut parser = parser::Parser::new((&mut self.visitor, &mut self.position));
let mut unmatched_paren = 0;
while let Some(token) = self.lexer.next() {
match &token {
parser::Token::LeftParen => unmatched_paren += 1,
parser::Token::RightParen => {
if unmatched_paren > 0 {
unmatched_paren -= 1;
}
}
_ => (),
}
self.lexer.update_position(parser.extra_mut().1);
if let Err(err) = parser.parse(token) {
return Some(Err(err));
}
if unmatched_paren == 0 {
return match parser.end_of_input() {
Ok((command, _)) => Some(Ok(command)),
Err(err) => Some(Err(err)),
};
}
}
if unmatched_paren > 0 {
// We ran out of valid tokens in the middle of a command.
let extra = parser.into_extra();
Some(Err(extra.0.parsing_error(
extra.1.clone(),
"unexpected end of input".into(),
)))
} else {
// There are no more valid tokens to parse.
// TODO: report invalid tokens as an error.
None
}
}