From 36cf7bef24bbd5ffccc8bac47a8c4d10dd5a265c Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 28 Nov 2020 18:20:10 +0100 Subject: refactor(tazjin/rlox): Thread through scanner errors ... and show them to users, very crudely. Change-Id: If4491b14db1124313f6ab7e5fbfdce9fea501d11 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2193 Reviewed-by: tazjin Tested-by: BuildkiteCI --- users/tazjin/rlox/src/errors.rs | 4 ++-- users/tazjin/rlox/src/interpreter.rs | 19 +++++++++++++++++-- users/tazjin/rlox/src/scanner.rs | 15 ++++++++++----- 3 files changed, 29 insertions(+), 9 deletions(-) (limited to 'users/tazjin') 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 = 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>) { + for token in tokens { println!("{:?}", token); } } + +fn report_errors(errors: Vec) { + 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> { + 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> { - let scanner = Scanner { +pub fn scan<'a>(input: &'a [char]) -> Result>, Vec> { + let mut scanner = Scanner { source: &input, tokens: vec![], errors: vec![], @@ -275,5 +274,11 @@ pub fn scan<'a>(input: &'a [char]) -> Vec> { line: 0, }; - return scanner.scan_tokens(); + scanner.scan_tokens(); + + if !scanner.errors.is_empty() { + return Err(scanner.errors); + } + + return Ok(scanner.tokens); } -- cgit 1.4.1