Arithmetic Expression Evaluator

mail@pastecode.io avatar
unknown
rust
16 days ago
1.2 kB
5
Indexable
Never
enum Operation {
    Add,
    Sub,
    Mul,
    Div,
}

enum Expression {
    Number(i32),
    Operation(Box<Expression>, Operation, Box<Expression>),
}

fn operation(left: i32, op: &Operation, right: i32) -> i32 {
    match op {
        Operation::Add => left + right,
        Operation::Sub => left - right,
        Operation::Mul => left * right,
        Operation::Div => left / right,
    }
}

fn evaluate(expression: &Expression) -> i32 {
    match expression {
        Expression::Number(n) => *n,
        Expression::Operation(left, op, right) => operation(evaluate(left), op, evaluate(right))
    }
}

fn operation_res(left: i32, op: &Operation, right: i32) -> Result<i32, String> {
    match op {
        Operation::Add => Ok(left + right),
        Operation::Sub => Ok(left - right),
        Operation::Mul => Ok(left * right),
        Operation::Div => if right != 0 { Ok(left / right) } else { Err("Division By Zero".to_string()) },
    }
}

fn evaluate_res(expression: &Expression) -> Result<i32, String> {
    match expression {
        Expression::Number(n) => Ok(*n),
        Expression::Operation(left, op, right) => operation_res(evaluate_res(left)?, op, evaluate_res(right)?)
    }
}
Leave a Comment