let rec xtree_eval e = function INT_TREE a -> a | ID_TREE a -> (Hashtbl.find e.ienv_var a) | PLUS_TREE (a, b) -> (xtree_eval e a) + (xtree_eval e b) | MINUS_TREE (a, b) -> (xtree_eval e a) - (xtree_eval e b) | TIMES_TREE (a, b) -> (xtree_eval e a) * (xtree_eval e b) | EQEQ_TREE (a,b) -> let av = (xtree_eval e a) in let bv = (xtree_eval e b) in if (av = bv) then 1 else 0; | GT_TREE (a,b) -> let av = (xtree_eval e a) in let bv = (xtree_eval e b) in if (av > bv) then 1 else 0; | GE_TREE (a,b) -> let av = (xtree_eval e a) in let bv = (xtree_eval e b) in if (av >= bv) then 1 else 0; ;; let rec stmt_eval e = function PRINT_TREE a -> print_string "> "; print_int(xtree_eval e a); print_newline(); | IF_TREE (a,b,c) -> if ((xtree_eval e a) != 0) then (stmt_eval e b) else (stmt_eval e c); | NOOP_TREE -> () | ASSIGN_TREE (a,b) -> (Hashtbl.add e.ienv_var a (xtree_eval e b)) | WHILE_TREE (a,b) -> while ((xtree_eval e a) != 0) do stmt_eval e b done | STMT_GROUP_TREE (a) -> stmt_group_eval e a | PROC_TREE (a,b) -> (Hashtbl.add e.ienv_proc a b) | CALL_TREE (a) -> stmt_eval e (Hashtbl.find e.ienv_proc a) | GET_TREE (a) -> (Hashtbl.add e.ienv_var a (read_int())) and stmt_group_eval e = function [] -> () | h::t -> (stmt_eval e h); (stmt_group_eval e t) ;; let rec stmts_eval e = function [] -> () | h::t -> stmt_eval e h ;
Źródło i licencja
Fragment artykułu Wikipedia — Ocamlyacc · historia autorów.
Tekst: CC BY-SA 4.0. Wydzielono fragment z dłuższego artykułu.