about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-11-28T17·20+0100
committertazjin <mail@tazj.in>2020-11-28T17·26+0000
commit36cf7bef24bbd5ffccc8bac47a8c4d10dd5a265c (patch)
treeccec3463fde0fc088f575d534745a1648844578e
parentaf793325c03d88add6efbcc9425a3db488f2cff9 (diff)
refactor(tazjin/rlox): Thread through scanner errors r/1956
... and show them to users, very crudely.

Change-Id: If4491b14db1124313f6ab7e5fbfdce9fea501d11
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2193
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
-rw-r--r--users/tazjin/rlox/src/errors.rs4
-rw-r--r--users/tazjin/rlox/src/interpreter.rs19
-rw-r--r--users/tazjin/rlox/src/scanner.rs15
3 files changed, 29 insertions, 9 deletions
diff --git a/users/tazjin/rlox/src/errors.rs b/users/tazjin/rlox/src/errors.rs
index 306cfec4ca..bab3f4667a 100644
--- a/users/tazjin/rlox/src/errors.rs
+++ b/users/tazjin/rlox/src/errors.rs
@@ -10,6 +10,6 @@ pub struct Error {
     pub kind: ErrorKind,
 }
 
-pub fn report(loc: &str, err: &Error) {
-    eprintln!("[line {}] Error {}: {:?}", err.line, loc, err.kind);
+pub fn report(err: &Error) {
+    eprintln!("[line {}] Error: {:?}", err.line, err.kind);
 }
diff --git a/users/tazjin/rlox/src/interpreter.rs b/users/tazjin/rlox/src/interpreter.rs
index 8031329e70..77f2492a46 100644
--- a/users/tazjin/rlox/src/interpreter.rs
+++ b/users/tazjin/rlox/src/interpreter.rs
@@ -1,9 +1,24 @@
-use crate::scanner;
+use crate::errors::{report, Error};
+use crate::scanner::{self, Token};
 
 // Run some Lox code and print it to stdout
 pub fn run(code: &str) {
     let chars: Vec<char> = code.chars().collect();
-    for token in scanner::scan(&chars) {
+
+    match scanner::scan(&chars) {
+        Ok(tokens) => print_tokens(tokens),
+        Err(errors) => report_errors(errors),
+    }
+}
+
+fn print_tokens<'a>(tokens: Vec<Token<'a>>) {
+    for token in tokens {
         println!("{:?}", token);
     }
 }
+
+fn report_errors(errors: Vec<Error>) {
+    for error in errors {
+        report(&error);
+    }
+}
diff --git a/users/tazjin/rlox/src/scanner.rs b/users/tazjin/rlox/src/scanner.rs
index e0b04981b4..2eed89bd6b 100644
--- a/users/tazjin/rlox/src/scanner.rs
+++ b/users/tazjin/rlox/src/scanner.rs
@@ -254,19 +254,18 @@ impl<'a> Scanner<'a> {
         self.add_token(token_kind);
     }
 
-    fn scan_tokens(mut self) -> Vec<Token<'a>> {
+    fn scan_tokens(&mut self) {
         while !self.is_at_end() {
             self.start = self.current;
             self.scan_token();
         }
 
         self.add_token(TokenKind::Eof);
-        return self.tokens;
     }
 }
 
-pub fn scan<'a>(input: &'a [char]) -> Vec<Token<'a>> {
-    let scanner = Scanner {
+pub fn scan<'a>(input: &'a [char]) -> Result<Vec<Token<'a>>, Vec<Error>> {
+    let mut scanner = Scanner {
         source: &input,
         tokens: vec![],
         errors: vec![],
@@ -275,5 +274,11 @@ pub fn scan<'a>(input: &'a [char]) -> Vec<Token<'a>> {
         line: 0,
     };
 
-    return scanner.scan_tokens();
+    scanner.scan_tokens();
+
+    if !scanner.errors.is_empty() {
+        return Err(scanner.errors);
+    }
+
+    return Ok(scanner.tokens);
 }