Fixed paren parsing

also made error reporting a bit nicer
This commit is contained in:
greg 2015-08-07 00:22:31 -07:00
parent 868373f409
commit b856023072
1 changed files with 9 additions and 7 deletions

View File

@ -18,6 +18,7 @@ pub enum AST {
DoNothing DoNothing
} }
#[derive(Debug)]
pub enum ParseResult { pub enum ParseResult {
Ok(AST), Ok(AST),
Err(String) Err(String)
@ -28,7 +29,9 @@ type Tokens<'a> = Peekable<Iter<'a,Token>>;
/* expect calls .next() and thus advances the token list */ /* expect calls .next() and thus advances the token list */
macro_rules! expect { macro_rules! expect {
($tok:expr, $tokens:expr) => ( if !expect_token($tok, $tokens) { ($tok:expr, $tokens:expr) => ( if !expect_token($tok, $tokens) {
return ParseResult::Err(format!("Expected {:?}", $tok)); let tokens_left: Vec<&Token> = $tokens.collect();
let err_string = format!("Expected {:?}\ntokens: {:?}", $tok, tokens_left);
return ParseResult::Err(err_string);
}) })
} }
@ -136,12 +139,6 @@ fn expression(tokens: &mut Tokens) -> ParseResult {
Some(&Keyword(Kw::While)) => { Some(&Keyword(Kw::While)) => {
while_expression(tokens) while_expression(tokens)
}, },
Some(&LParen) => {
tokens.next();
let expr = expression(tokens);
expect!(RParen, tokens);
expr
},
_ => binop_expression(0, tokens) _ => binop_expression(0, tokens)
} }
} }
@ -260,6 +257,11 @@ fn simple_expression(tokens: &mut Tokens) -> ParseResult {
Some(&NumLiteral(n)) => Some(&NumLiteral(n)) =>
ParseResult::Ok(AST::Number(n)), ParseResult::Ok(AST::Number(n)),
Some(&LParen) => {
let within_paren = expression(tokens);
expect!(RParen, tokens);
within_paren
},
_ => ParseResult::Err("Bad parse in simple_expression()".to_string()) _ => ParseResult::Err("Bad parse in simple_expression()".to_string())
} }
} }