use sim_kernel::{Error, Result};
use super::tokenize::SpannedToken;
pub struct ParseCx {
tokens: Vec<SpannedToken>,
index: usize,
}
impl ParseCx {
pub fn new(tokens: Vec<SpannedToken>) -> Self {
Self { tokens, index: 0 }
}
pub fn peek(&self) -> Option<&SpannedToken> {
self.tokens.get(self.index)
}
pub fn advance(&mut self) -> Option<SpannedToken> {
let token = self.tokens.get(self.index).cloned()?;
self.index += 1;
Some(token)
}
pub fn next_required(&mut self) -> Result<SpannedToken> {
self.advance()
.ok_or_else(|| Error::Eval("unexpected end of algol input".to_owned()))
}
pub fn is_empty(&self) -> bool {
self.index >= self.tokens.len()
}
}