(* RAMANANANDRO Tahina Module Print : impression d'éléments du langage. Requiert print.mli *) type value = ECST of string (* Erreur a l'execution *) | BCST of bool (* Valeur booleenne *) | NCST of int ;; (* Valeur entiere *) (* impression des valeurs a l'execution *) let echo_val = function | ECST s -> print_string ("Exception(\"" ^ s ^ "\")") | BCST true -> print_string "true" | BCST false -> print_string "false" | NCST i -> print_int i type expr = CST of string | VAR of string | ADD of expr * expr | SUB of expr * expr | MULT of expr * expr | DIV of expr * expr | LESS of expr * expr | EQUAL of expr * expr | NOT of expr | AND of expr * expr | IF of expr * (expr * expr) | CALL of string * (expr list) | EXPRSEQ of expr * expr | OUTPUT of expr | INPUT | RANDOM of expr let print_expr e = let rec imprime_expr0 = function | CST s -> print_string s | VAR s -> print_string s | ADD (a,b) -> imprime_binaire a " + " b | SUB (a,b) -> imprime_binaire a " - " b | MULT (a,b) -> imprime_binaire a " * " b | DIV (a,b) -> imprime_binaire a " / " b | LESS (a,b) -> imprime_binaire a " < " b | EQUAL (a,b) -> imprime_binaire a " = " b | NOT a -> print_string "not("; imprime_expr0 a; print_char ')' | AND (a,b) -> imprime_binaire a " & " b | IF (cond, (ev, ef)) -> print_string "if "; imprime_expr0 cond; print_string " then "; imprime_expr0 ev; print_string " else "; imprime_expr0 ef; print_string " fi" | CALL (f, l) -> print_string (f ^ "("); let rec aux = function | [] -> print_string ")" | [a] -> imprime_expr0 a; print_string ")" | a::q -> imprime_expr0 a; print_string ", "; aux q in aux l | EXPRSEQ (e1, e2) -> imprime_binaire e1 " : " e2 | RANDOM e1 -> print_string "random("; imprime_expr0 e1; print_string ")" | INPUT -> print_string "input" | OUTPUT e1 -> print_string "output("; imprime_expr0 e1; print_string ")" and imprime_binaire a op b = print_string "("; imprime_expr0 a; print_string op; imprime_expr0 b; print_string ")" in (imprime_expr0 e; flush stdout) (* liste d'expressions *) type expr_list = expr list ;; (* impression d'une liste d'expressions *) let print_expr_list l = print_string "[\n"; List.iter (fun x -> print_expr x; print_string ";\n") l; print_string "]" (*** pile a l'execution ***) (* parametre effectif par valeur *) type parval = VALUE of value | LAZYSTAT of ((expr * environment) * value option ref) (* par necessite statique *) | LAZYDYN of (expr * value option ref) (* par necessite dynamique *) (* liaison de parametre : paire (nom du parametre formel, *) (* valeur du parametre effectif) *) and parameter_binding = (string * parval) (* liaison de parametres : liste de paires (nom du parametre *) (* formel, valeur du parametre effectif) *) and bindings = parameter_binding list (* activation (de fonction) = paire (nom de fonction appelee, *) (* liaison de parametres) *) and activation = string * bindings (* environnement : liste d'activations *) and environment = activation list ;; (* impression d'un parametre effectif par valeur *) let rec print_parval = function | VALUE v -> (print_string "Value " ; echo_val v) | LAZYDYN (e, vr) -> (print_string "LazyDyn " ; print_expr e ; match !vr with Some v -> (print_string " Evalue a : " ; echo_val v) | None -> print_string "Non evalue" ) | LAZYSTAT (er, vr) -> (print_string "LasyStat "; print_expr_env er ; match !vr with Some v -> (print_string " Evalue a : " ; echo_val v) | None -> print_string "Non evalue") (* impression d'une liaison de parametre *) and print_parameter_binding (s, p) = print_string s; print_string " = "; print_parval p; print_string ";\n" (* impression d'une liste de liaisons de parametres *) and print_bindings l = List.iter print_parameter_binding l (* impression d'une activation de fonction *) and print_activation (s, b) = print_string ("Appel : " ^ s ^ "\n"); print_bindings b; print_string "---\n" (* impression d'un environnement *) and print_environnement l = List.iter print_activation l (* impression d'une paire (expression, environnement) *) and print_expr_env (ex, en) = print_string "Expression :"; print_expr ex; print_string "\n"; print_environnement en (* impression d'une paire (environnement, valeur) *) and print_reseval (e, v) = print_environnement e; print_string "Valeur retournée : "; echo_val v; print_string "\n"