diff --git a/src/evaluator.rs b/src/evaluator.rs new file mode 100644 index 0000000..8c12e93 --- /dev/null +++ b/src/evaluator.rs @@ -0,0 +1,30 @@ +use parser::AST; + +struct Evaluator { + ast: AST +} + +impl Evaluator { + pub fn run(&mut self) -> String { + while self.ast.can_reduce() { + self.ast.reduce(); + } + + format!("{}", self.ast) + } +} + +impl AST { + fn can_reduce(&self) -> bool { + false + } + + fn reduce(&mut self) { + + } +} + +pub fn evaluate(ast: AST) -> String { + let mut ev = Evaluator { ast: ast }; + ev.run() +} diff --git a/src/main.rs b/src/main.rs index 09575a2..2fa22cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,6 +14,9 @@ mod tokenizer; use parser::{ParseResult, parse}; mod parser; +use evaluator::{evaluate}; +mod evaluator; + fn main() { let args: Vec = std::env::args().collect(); @@ -63,5 +66,14 @@ fn repl_handler(input: &str, state: &mut InterpreterState) -> String { if state.show_parse { println!("Parse: {:?}", parse(tokenize(input))) } - format!("{:?}", parse(tokenize(input))) + + let parse_result = parse(tokenize(input)); + match parse_result { + Ok(ast) => { + format!("{}", evaluate(ast)) + }, + Err(err) => { + format!("Parse error: {:?}", err) + } + } } diff --git a/src/parser.rs b/src/parser.rs index 5c3adef..aaba03e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,5 +1,6 @@ use std::iter::Peekable; use std::vec::IntoIter; +use std::fmt; use tokenizer::Token; @@ -10,6 +11,12 @@ pub enum AST { Name(String), } +impl fmt::Display for AST { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", "GENERIC DISPLAY") + } +} + #[derive(Debug)] pub struct ParseError { err: String