r2rust_core/
evaluator.rs

1/// Evaluator module for processing AST statements and expressions.
2///
3/// This module provides functions to evaluate statements and expressions
4/// using the provided environment.
5
6use crate::ast::{Expr, Statement};
7use crate::environment::Environment;
8
9/// Evaluates a statement and returns its result.
10///
11/// # Arguments
12/// * `statement` - The statement to evaluate.
13/// * `env` - The environment to use for variable lookups and assignments.
14///
15/// # Returns
16/// The result of the evaluation, or an error if evaluation fails.
17pub fn evaluate(statement: Statement, env: &mut Environment) -> Result<f64, String> {
18    match statement {
19        Statement::Assign(var, expr) => {
20            let value = eval_expr(expr, env)?;
21            env.set(var, value);
22            Ok(value)
23        }
24        Statement::Expr(expr) => eval_expr(expr, env),
25    }
26}
27
28fn eval_expr(expr: Expr, env: &Environment) -> Result<f64, String> {
29    match expr {
30        Expr::Number(n) => Ok(n),
31        Expr::Add(lhs, rhs) => Ok(eval_expr(*lhs, env)? + eval_expr(*rhs, env)?),
32        Expr::Sub(lhs, rhs) => Ok(eval_expr(*lhs, env)? - eval_expr(*rhs, env)?),
33        Expr::Variable(var) => env
34            .get(&var)
35            .cloned()
36            .ok_or_else(|| format!("Variable '{}' not found", var)),
37    }
38}