open Parser

exception VarUndef of string

let genv = ref []

let eval_expr = 
  let rec eval_rec env = function
      Cst x -> x

    | Var x -> 
        begin
          try 
            List.assoc x env 
          with 
              Not_found -> 
                try 
                  List.assoc x !genv 
                with
                    Not_found -> raise (VarUndef x)
        end

    | Sum(e1,e2) -> 
        (eval_rec env e1) + (eval_rec env e2)

    | Diff(e1,e2) -> 
        (eval_rec env e1) - (eval_rec env e2)

    | Prod(e1,e2) -> 
        (eval_rec env e1) * (eval_rec env e2)

    | Div(e1,e2) -> 
        (eval_rec env e1) / (eval_rec env e2)

    | Letin(x,e1,e2) -> 
        let t = eval_rec env e1 in eval_rec ((x,t)::env) e2
  in 
  eval_rec []
    
let eval_instr = function
    Set(x,e) -> 
      let t=eval_expr e in genv:=(x,t)::!genv
                             
  | Print e -> print_int (eval_expr e)
      



This document was generated using caml2html