diff options
| -rw-r--r-- | src/compiler.rs | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index 2a20110..80230d0 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -317,40 +317,37 @@ impl Compiler { fn statement(&mut self, block: &mut Block) { self.clear_panic(); - let tokens = self.peek_to(); - println!("{:?}", tokens); - match tokens { - [Token::Print, _, _, _] => { - self.eat(); - self.expression(block); - block.add(Op::Print, self.line()); - expect!(self, Token::Newline, "Expect newline after expression."); - }, - - [Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual, _] => { - self.eat(); - self.eat(); - self.eat(); - if let Ok(typ) = Type::try_from(typ.as_ref()) { - self.define_variable(&name, typ, block); - } else { - error!(self, format!("Failed to parse type '{}'.", typ)); - } - expect!(self, Token::Newline, "Expect newline after expression."); - } - - [Token::Identifier(name), Token::ColonEqual, _, _] => { - self.eat(); - self.eat(); - self.define_variable(&name, Type::UnkownType, block); - expect!(self, Token::Newline, "Expect newline after expression."); - } - - _ => { - self.expression(block); - block.add(Op::Pop, self.line()); - expect!(self, Token::Newline, "Expect newline after expression."); + if let [Token::Print] = self.peek_to() { + self.eat(); + self.expression(block); + block.add(Op::Print, self.line()); + expect!(self, Token::Newline, "Expect newline after expression."); + } else if let [ + Token::Identifier(name), + Token::Identifier(typ), + Token::ColonEqual + ] = self.peek_to() { + self.eat(); + self.eat(); + self.eat(); + if let Ok(typ) = Type::try_from(typ.as_ref()) { + self.define_variable(&name, typ, block); + } else { + error!(self, format!("Failed to parse type '{}'.", typ)); } + expect!(self, Token::Newline, "Expect newline after expression."); + } else if let [ + Token::Identifier(name), + Token::ColonEqual + ] = self.peek_to() { + self.eat(); + self.eat(); + self.define_variable(&name, Type::UnkownType, block); + expect!(self, Token::Newline, "Expect newline after expression."); + } else { + self.expression(block); + block.add(Op::Pop, self.line()); + expect!(self, Token::Newline, "Expect newline after expression."); } } |
