diff --git a/src/interpreter.rs b/src/interpreter.rs index d4476cd..d5e3ce0 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -1,6 +1,6 @@ use crate::{ ast, - errors::InterpreterError, + errors::{ErrorHandler, InterpreterError}, tokens::{Token, TokenType}, }; @@ -31,6 +31,16 @@ pub trait Interpretable { fn interprete(&self) -> Result; } +/// Evaluate an interpretable, returning its value. +pub fn evaluate(err_hdl: &mut ErrorHandler, ast: &dyn Interpretable) -> Option { + match ast.interprete() { + Ok(v) => Some(v), + Err(e) => { + e.report(err_hdl); + None + } + } +} /* -------------------------------- * * INTERPRETER FOR EXPRESSION NODES * diff --git a/src/main.rs b/src/main.rs index d091008..90f9340 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use std::{ use ast::AstDumper; use errors::ErrorHandler; +use interpreter::evaluate; use parser::Parser; use scanner::Scanner; @@ -31,7 +32,11 @@ fn run(source: String) -> ErrorHandler { match parser.parse(&mut error_handler) { None => (), Some(ast) => { - println!("AST generated ! {}", ast.dump()) + println!("AST generated ! {}", ast.dump()); + match evaluate(&mut error_handler, &ast) { + Some(v) => println!("Final evaluated value: {:?}", v), + None => (), + } } }