diff options
Diffstat (limited to 'users/tazjin/rlox/src/interpreter.rs')
-rw-r--r-- | users/tazjin/rlox/src/interpreter.rs | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/users/tazjin/rlox/src/interpreter.rs b/users/tazjin/rlox/src/interpreter.rs index 6c411ded5e11..c68101cf68a6 100644 --- a/users/tazjin/rlox/src/interpreter.rs +++ b/users/tazjin/rlox/src/interpreter.rs @@ -1,33 +1,25 @@ use crate::errors::{report, Error, ErrorKind}; -use crate::parser::{self, Expr, Literal}; -use crate::scanner::{self, Token, TokenKind}; +use crate::parser::{self, Expr, Literal, Program, Statement}; +use crate::scanner::{self, TokenKind}; // Run some Lox code and print it to stdout pub fn run(code: &str) { let chars: Vec<char> = code.chars().collect(); match scanner::scan(&chars) { - Ok(tokens) => { - print_tokens(&tokens); - match parser::parse(tokens) { - Ok(expr) => { - println!("Expression:\n{:?}", expr); - println!("Result: {:?}", eval(&expr)); + Ok(tokens) => match parser::parse(tokens) { + Ok(program) => { + println!("Program:\n{:?}", program); + if let Err(err) = run_program(&program) { + println!("Error in program: {:?}", err); } - Err(errors) => report_errors(errors), } - } + Err(errors) => report_errors(errors), + }, Err(errors) => report_errors(errors), } } -fn print_tokens<'a>(tokens: &Vec<Token<'a>>) { - println!("Tokens:"); - for token in tokens { - println!("{:?}", token); - } -} - fn report_errors(errors: Vec<Error>) { for error in errors { report(&error); @@ -111,3 +103,19 @@ fn eval<'a>(expr: &Expr<'a>) -> Result<Literal, Error> { Expr::Binary(binary) => eval_binary(binary), } } + +fn run_program<'a>(program: &Program<'a>) -> Result<(), Error> { + for stmt in program { + match stmt { + Statement::Expr(expr) => { + eval(expr)?; + } + Statement::Print(expr) => { + let result = eval(expr)?; + println!("{:?}", result) + } + } + } + + Ok(()) +} |