exception VarUndef of string
let genv = ref []
let eval_expr =
let rec eval_rec env = function
Cst x -> x
| Var x ->
(try List.assoc x env with
Not_found ->
try List.assoc x !genv with
Not_found -> raise(VarUndef x))
| 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)
| Quot(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) -> genv := (x,eval_expr e)::!genv
| Print(e) -> Printf.printf "= %d" (eval_expr e)