Implement calculating
This commit is contained in:
+34
@@ -0,0 +1,34 @@
|
||||
use crate::tokenizer::Token;
|
||||
|
||||
pub fn eval(tokens: Vec<Token>) -> 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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user