aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 22:05:56 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 22:05:56 +0100
commita894b3642114f63209fb4b787187ba249672ccee (patch)
tree449156f6a34d928788d60c7f8b18682d040216ea /src/compiler.rs
parent3ede943556bebb85427415f21ec231973da9e080 (diff)
downloadsylt-a894b3642114f63209fb4b787187ba249672ccee.tar.gz
Add line numbers
Diffstat (limited to 'src/compiler.rs')
-rw-r--r--src/compiler.rs21
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
}