diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 7652d52..be9135a 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,11 +1,28 @@ use super::types::*; use crate::ast; -fn parse_expr(tokens: &mut Vec) -> Result { - todo!() +fn parse_simple_expr(tokens: &mut Vec) -> Result { + let start = tokens.last()?; + match start { + Token::OpenParen => { + tokens.pop(); + let expr = parse_expr(tokens)?; + if Some(p) = tokens.pop_if(|t| t.token == Token::CloseParen) { + Ok(expr) + } else { + Err(Error::UnexpectedToken { expected: Token::CloseParen, got: start}) + } + + } + Token::Number(n) => { + tokens.pop(); + Ok(ast::Expr::Value(ast::Value::Number(n))) + } + } } enum Error { + UnexpectedToken{expected: Token, got: LocatedToken}, UnexpectedToken(LocatedToken), UnexpectedEndOfInput, } @@ -26,10 +43,10 @@ fn parse_definition(tokens: &mut Vec) -> Result); + +impl Tokens { + fn peek(&mut self) -> Option { + self.last() + } + fn next(&mut self) -> Option { + self.pop() + } +}