aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-11 12:22:44 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-11 12:22:44 +0100
commita1e0b7c7fb6e1dc066e61cc302f17466777a488b (patch)
treeab327bec6c5b3ed913e46f034b61ee7a6b6047e5 /src
parentdde985c7abb4dbe37281131b8b36a75302e48438 (diff)
downloadsylt-a1e0b7c7fb6e1dc066e61cc302f17466777a488b.tar.gz
Assignment
Diffstat (limited to 'src')
-rw-r--r--src/compiler.rs23
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>> {