diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-09 22:05:56 +0100 |
|---|---|---|
| committer | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-09 22:05:56 +0100 |
| commit | a894b3642114f63209fb4b787187ba249672ccee (patch) | |
| tree | 449156f6a34d928788d60c7f8b18682d040216ea /src/compiler.rs | |
| parent | 3ede943556bebb85427415f21ec231973da9e080 (diff) | |
| download | sylt-a894b3642114f63209fb4b787187ba249672ccee.tar.gz | |
Add line numbers
Diffstat (limited to 'src/compiler.rs')
| -rw-r--r-- | src/compiler.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index c34063d..40a597f 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -23,7 +23,7 @@ impl Compiler { } fn error(&self, msg: &str) -> ! { - println!("ERROR: {} range {:?}", msg, self.tokens[self.curr].1); + println!("ERROR: {} line {:?}", msg, self.line()); panic!(); } @@ -63,6 +63,13 @@ impl Compiler { } } + fn line(&self) -> Option<usize> { + match self.tokens.get(self.curr) { + Some((_, line)) => Some(*line), + None => None, + } + } + fn prefix(&mut self, token: Token, block: &mut Block) -> bool { match token { Token::LeftParen => self.grouping(block), @@ -109,7 +116,7 @@ impl Compiler { Token::Bool(b) => { Value::Bool(b) } _ => { self.error("Invalid value.") } }; - block.add(Op::Constant(value)); + block.add(Op::Constant(value), self.line()); } fn grouping(&mut self, block: &mut Block) { @@ -131,7 +138,7 @@ impl Compiler { _ => self.error("Invalid unary operator"), }; self.value(block); - block.add(op); + block.add(op, self.line()); } fn binary(&mut self, block: &mut Block) { @@ -147,7 +154,7 @@ impl Compiler { Token::AssertEqual => Op::AssertEqual, _ => { self.error("Illegal operator"); } }; - block.add(op); + block.add(op, self.line()); } fn comparison(&mut self, block: &mut Block) { @@ -163,7 +170,7 @@ impl Compiler { Token::GreaterEqual => &[Op::Less, Op::Not], _ => { self.error("Illegal comparison operator"); } }; - block.add_from(op); + block.add_from(op, self.line()); } fn expression(&mut self, block: &mut Block) { @@ -192,13 +199,13 @@ impl Compiler { } self.expression(&mut block); - block.add(Op::Print); + block.add(Op::Print, self.line()); if self.eat() != Token::Newline { self.error("Invalid expression"); } } - block.add(Op::Return); + block.add(Op::Return, self.line()); block } |
