1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
use lexer::*; use parser::*; pub fn compute(expr: &Expr) -> f64 { match expr { Expr::Constant(num) => *num, Expr::Neg(expr) => -compute(expr), Expr::BinOp(op, lexpr, rexpr) => { let lnum = compute(&lexpr); let rnum = compute(&rexpr); match op { Operator::Plus => lnum + rnum, Operator::Minus => lnum - rnum, Operator::Star => lnum * rnum, Operator::Slash => lnum / rnum, _ => unimplemented!(), } } Expr::Pow(lexpr, rexpr) => { compute(&lexpr).powf(compute(&rexpr)) } } }