diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-01-11 03:30:14 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-01-11 03:30:14 +0100 |
| commit | def028a4d3d410c3088f09cf01e46ec43584934b (patch) | |
| tree | 28bf18454932a4ec8102a376b167449888be5af5 | |
| parent | 83984ea719f1e613a6382c7e1052738ee94858de (diff) | |
| download | sylt-min-const-generics.tar.gz | |
common declaration codemin-const-generics
| -rw-r--r-- | src/compiler.rs | 40 |
1 files 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()); |
