diff --git a/src/eval.rs b/src/eval.rs new file mode 100644 index 0000000..eedcb4b --- /dev/null +++ b/src/eval.rs @@ -0,0 +1,34 @@ +use crate::tokenizer::Token; + +pub fn eval(tokens: Vec) -> i32 { + let mut stack = Vec::new(); + + for t in tokens { + match t { + Token::Number(val) => stack.push(val), + Token::Addition => { + let right = stack.pop().unwrap(); + let left = stack.pop().unwrap(); + stack.push(left + right); + }, + Token::Substruction => { + let right = stack.pop().unwrap(); + let left = stack.pop().unwrap(); + stack.push(left - right); + }, + Token::Multiplication => { + let right = stack.pop().unwrap(); + let left = stack.pop().unwrap(); + stack.push(left * right); + }, + Token::Division => { + let right = stack.pop().unwrap(); + let left = stack.pop().unwrap(); + stack.push(left / right); + }, + _ => {} + } + } + + return stack.pop().unwrap(); +} diff --git a/src/main.rs b/src/main.rs index 3491922..2b2f784 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,9 @@ use tokenizer::tokenizer; mod rpn; use rpn::to_rpn; +mod eval; +use eval::eval; + fn main() { let stdin = io::stdin(); @@ -20,6 +23,9 @@ fn main() { let tokens = tokenizer(&buffer); let rpn = to_rpn(tokens); + let res = eval(rpn); + + println!("= {}\n", res); buffer.clear(); }