(* ========================= Parte 1 ============================== *) (* Valutazione di espressioni *) (* Sintassi astratta di espressioni *) type expr = | CstI of int (* costante intera *) | Prim of string * expr * expr;; (* operatore applicato a due argomenti *) (* Valutazione: eval e => valore di e *) let rec eval e : int = match e with | CstI i -> i | Prim("+", e1, e2) -> eval e1 + eval e2 | Prim("*", e1, e2) -> eval e1 * eval e2 | Prim("-", e1, e2) -> eval e1 - eval e2 | Prim(op, _, _) -> failwith ("unknown operation " ^ op) ;; (* esempi di espressioni *) let e1 = CstI 17;; let e2 = Prim("+", CstI 3, CstI 4);; let e3 = Prim("+", Prim("*", CstI 7, CstI 9), CstI 5);; (* esempi di valutazione *) print_endline(string_of_int(eval e1));; print_endline(string_of_int(eval e2));; print_endline(string_of_int(eval e3));; (* ========================= fine parte 1 ====================== *)