pub mod abstract_tree; pub mod built_in_functions; pub mod context; pub mod error; pub mod lexer; pub mod parser; pub mod value; use context::{std_context, Context}; use error::Error; use lexer::lex; use parser::parse; pub use value::Value; pub fn interpret(source: &str) -> Result, Vec> { let mut interpreter = Interpreter::new(std_context().clone()); interpreter.run(source) } pub struct Interpreter { context: Context, } impl Interpreter { pub fn new(context: Context) -> Self { Interpreter { context } } pub fn run(&mut self, source: &str) -> Result, Vec> { let tokens = lex(source)?; let abstract_tree = parse(&tokens)?; let value_option = abstract_tree.run(&self.context)?; Ok(value_option) } }