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))
        }
    }
}