diff options
author | Vincent Ambo <mail@tazj.in> | 2021-01-16T12·11+0300 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2021-01-16T13·46+0000 |
commit | 29335a8b63ba62bd83019eb193baba7c5b656da3 (patch) | |
tree | 2018e86c92ab702ac2549da399bd707769ccd0c7 /users/tazjin/rlox/src/main.rs | |
parent | f472c824277d80134ce9e55c0a2ce1cb98201134 (diff) |
feat(tazjin/rlox): Implement variable depth resolver r/2113
Implements the first part of the resolver from https://craftinginterpreters.com/resolving-and-binding.html This is wired up to the execution paths in main, but not yet in the tests. The resolved depth is also not actually used for variable lookups (yet). Change-Id: I3a8615252b7b9b12d5a290c5ddf85988f61b9184 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2403 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/main.rs')
-rw-r--r-- | users/tazjin/rlox/src/main.rs | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/users/tazjin/rlox/src/main.rs b/users/tazjin/rlox/src/main.rs index 8970349bfa69..24ebe503b692 100644 --- a/users/tazjin/rlox/src/main.rs +++ b/users/tazjin/rlox/src/main.rs @@ -7,6 +7,7 @@ use std::process; mod errors; mod interpreter; mod parser; +mod resolver; mod scanner; fn main() { @@ -48,17 +49,13 @@ fn run_prompt() { fn run(lox: &mut interpreter::Interpreter, code: &str) { let chars: Vec<char> = code.chars().collect(); - match scanner::scan(&chars) { - Ok(tokens) => match parser::parse(tokens) { - Ok(program) => { - println!("Program:\n{:?}", program); - if let Err(err) = lox.interpret(&program) { - println!("Error in program: {:?}", err); - } - } - Err(errors) => report_errors(errors), - }, - Err(errors) => report_errors(errors), + let result = scanner::scan(&chars) + .and_then(|tokens| parser::parse(tokens)) + .and_then(|program| resolver::resolve(program).map_err(|e| vec![e])) + .and_then(|program| lox.interpret(&program).map_err(|e| vec![e])); + + if let Err(errors) = result { + report_errors(errors); } } |