rockscript 0.2.0

Esolang called Rockscript
use crate::{error::ParseError, lexer::Token, parser::{Parser, expression::SpannedStatement}};

impl Parser {
    pub fn current(&self) -> Option<Token> {
        self.tokens.get(self.pos)
            .map_or(None, |t| Some(t.token.clone()))
    }

    pub fn advance(&mut self) {
        self.pos += 1;
    }

    pub fn current_span(&self) -> std::ops::Range<usize> {
        self.tokens.get(self.pos)
            .map(|t| t.span.clone())
            .unwrap_or_else(|| {
                let end = self.tokens.last().map(|t| t.span.end).unwrap_or(0);
                end..end
            })
    }

    pub fn parse_until(&mut self, stop: &[Token]) -> Result<Vec<SpannedStatement>, ParseError> {
        let mut body = Vec::new();
        while !stop.iter().any(|t| self.current().as_ref() == Some(t)) {
            body.push(self.parse_statement(self.current().unwrap())?);
        }
        Ok(body)
    }
}