From def028a4d3d410c3088f09cf01e46ec43584934b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 11 Jan 2021 03:30:14 +0100 Subject: common declaration code --- src/compiler.rs | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/compiler.rs b/src/compiler.rs index a096947..34a8447 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -314,6 +314,22 @@ impl Compiler { // block.add(Op::Assign(self.stack.len() - 1), self.line()); } + fn declaration(&mut self, name: &str, typ_str: Option<&str>, block: &mut Block) { + self.eat(); + self.eat(); + let typ = if let Some(typ) = typ_str { + self.eat(); + Type::try_from(typ.as_ref()) + } else { + Ok(Type::UnkownType) + }; + if typ.is_err() { + error!(self, format!("Failed to parse type '{}'.", typ_str.unwrap())); + } else { + self.define_variable(&name, typ.unwrap(), block); + } + } + fn statement(&mut self, block: &mut Block) { self.clear_panic(); @@ -321,26 +337,10 @@ impl Compiler { self.eat(); self.expression(block); block.add(Op::Print, self.line()); - } 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)); - } - } else if let [ - Token::Identifier(name), - Token::ColonEqual - ] = self.peek_to() { - self.eat(); - self.eat(); - self.define_variable(&name, Type::UnkownType, block); + } else if let [Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual] = self.peek_to() { + self.declaration(&name, Some(&typ), block); + } else if let [Token::Identifier(name), Token::ColonEqual] = self.peek_to() { + self.declaration(&name, None, block); } else { self.expression(block); block.add(Op::Pop, self.line()); -- cgit v1.2.1