diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-11 12:22:44 +0100 |
|---|---|---|
| committer | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-11 12:22:44 +0100 |
| commit | a1e0b7c7fb6e1dc066e61cc302f17466777a488b (patch) | |
| tree | ab327bec6c5b3ed913e46f034b61ee7a6b6047e5 /src | |
| parent | dde985c7abb4dbe37281131b8b36a75302e48438 (diff) | |
| download | sylt-a1e0b7c7fb6e1dc066e61cc302f17466777a488b.tar.gz | |
Assignment
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler.rs | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index 6074660..1fd64d7 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -298,7 +298,6 @@ impl Compiler { } fn define_variable(&mut self, name: &str, typ: Type, block: &mut Block) { - if self.find_local(&name, block).is_some() { error!(self, format!("Multiple definitions of {}.", name)); return; @@ -307,8 +306,15 @@ impl Compiler { self.expression(block); self.stack.push(Variable { name: String::from(name), typ }); + } - // block.add(Op::Assign(self.stack.len() - 1), self.line()); + fn assign(&mut self, name: &str, block: &mut Block) { + if let Some(slot) = self.find_local(&name, block) { + self.expression(block); + block.add(Op::Assign(slot), self.line()); + } else { + error!(self, format!("Using undefined variable {}.", name)); + } } fn statement(&mut self, block: &mut Block) { @@ -319,7 +325,6 @@ impl Compiler { 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, _) => { @@ -331,22 +336,28 @@ impl Compiler { } 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."); } + (Token::Identifier(name), Token::Equal, _, _) => { + self.eat(); + self.eat(); + self.assign(&name, block); + } + + (Token::Newline, _, _, _) => {} + _ => { self.expression(block); block.add(Op::Pop, self.line()); - expect!(self, Token::Newline, "Expect newline after expression."); } } + expect!(self, Token::Newline, "Expect newline after expression."); } pub fn compile(&mut self, name: &str, file: &Path) -> Result<Block, Vec<Error>> { |
