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;
|
mod rpn;
|
||||||
use rpn::to_rpn;
|
use rpn::to_rpn;
|
||||||
|
|
||||||
|
mod eval;
|
||||||
|
use eval::eval;
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let stdin = io::stdin();
|
let stdin = io::stdin();
|
||||||
@@ -20,6 +23,9 @@ fn main() {
|
|||||||
|
|
||||||
let tokens = tokenizer(&buffer);
|
let tokens = tokenizer(&buffer);
|
||||||
let rpn = to_rpn(tokens);
|
let rpn = to_rpn(tokens);
|
||||||
|
let res = eval(rpn);
|
||||||
|
|
||||||
|
println!("= {}\n", res);
|
||||||
|
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user