From 0381caa1c2e8114a44dfa2a12314257bf5b569ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 11 Jan 2021 03:13:32 +0100 Subject: showcase const generics --- src/compiler.rs | 63 +++++++++++++++++++++++++++------------------------------ 1 file 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."); } } -- cgit v1.2.1