use std::error::Error;
use crate::ast::{ASTNode, NodeType};
pub struct Interpreter;
impl Interpreter {
pub fn evaluate(node: &ASTNode) -> Result<i32, Box<dyn Error>> {
match node.op {
NodeType::Add => {
let left_val = Interpreter::evaluate(node.left.as_ref().ok_or("Missing left operand")?)?;
let right_val = Interpreter::evaluate(node.right.as_ref().ok_or("Missing right operand")?)?;
Ok(left_val + right_val)
},
NodeType::Subtract => {
let left_val = Interpreter::evaluate(node.left.as_ref().ok_or("Missing left operand")?)?;
let right_val = Interpreter::evaluate(node.right.as_ref().ok_or("Missing right operand")?)?;
Ok(left_val - right_val)
},
NodeType::Multiply => {
let left_val = Interpreter::evaluate(node.left.as_ref().ok_or("Missing left operand")?)?;
let right_val = Interpreter::evaluate(node.right.as_ref().ok_or("Missing right operand")?)?;
Ok(left_val * right_val)
},
NodeType::Divide => {
let left_val = Interpreter::evaluate(node.left.as_ref().ok_or("Missing left operand")?)?;
let right_val = Interpreter::evaluate(node.right.as_ref().ok_or("Missing right operand")?)?;
if right_val == 0 {
return Err("Division by zero".into());
}
Ok(left_val / right_val)
},
NodeType::IntLit => {
Ok(node.int_value.ok_or("Missing integer value")?)
},
}
}
}