From 30173f4aaf2ef32ddf2e0297cc15649f8b108d96 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Mon, 16 Jan 2017 10:29:56 -0800 Subject: [PATCH] Parse a single boolean expression into a Program! --- src/parser/mod.rs | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 950449e..cee73fb 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -20,28 +20,44 @@ impl Parser { } pub fn parse(&mut self) -> Result { - Ok(self.parse_program()) + self.parse_program() } } impl Parser { - fn parse_program(&mut self) -> Program { + fn parse_program(&mut self) -> Result { let mut forms: Vec = Vec::new(); - while let Some(lex) = self.lexer.next() { - let form = match lex.token { - _ => { - println!("{:?}", lex.token); - lex.token + loop { + match self.parse_expression() { + Ok(expr) => { + let is_eof = expr == Expression::EOF; + forms.push(expr); + if is_eof { + break; + } }, - }; + Err(error) => panic!("PARSE ERROR: error = {}, lex = {:?}", error.desc, error.lex) + } + } + Ok(Program::new(forms)) + } + + fn parse_expression(&mut self) -> Result { + if let Some(next) = self.lexer.next() { + match next.token { + Token::Boolean(value) => Ok(Expression::Atom(Box::new(value))), + Token::Character(value) => Ok(Expression::Atom(Box::new(value))), + _ => Err(Error { lex: next, desc: "Invalid token".to_string() }) + } + } + else { + Ok(Expression::EOF) } - forms.push(Expression::EOF); - Program::new(forms) } } pub struct Error { - lex: Lexer, + lex: Lex, desc: String, } @@ -50,10 +66,17 @@ mod tests { use super::*; use super::nodes::*; use lexer::Lexer; + use types::Boolean; #[test] fn parses_empty_input() { let mut parser = Parser::new(Lexer::new("")); assert_eq!(parser.parse().ok().unwrap(), Program::new(vec![Expression::EOF])); } + + #[test] + fn parses_single_boolean() { + let mut parser = Parser::new(Lexer::new("#t")); + assert_eq!(parser.parse().ok().unwrap(), Program::new(vec![Expression::Atom(Box::new(Boolean::new(true))), Expression::EOF])); + } }