(*runvhc.ml *) #open "aintv";; #open "print";; #open "lexervhc";; #open "lexing";; #open "parservhc";; #open "prog";; #open "verif";; #open "typage";; #open "ci";; #open "compile";; #open "analyse";; let print_type = function Bool -> print_string "booléen" | Entier -> print_string "entier" | Var i -> print_string ("'"^string_of_int i);; let nouvelle_section s = print_string "-----------------\n"; print_string (s^" :\n");; let run()= let lexbuf =create_lexer_channel std_in in let p =(Program Token lexbuf)in nouvelle_section "Code du programme"; print_prog p; nouvelle_section "Analyse de nécessité"; let p'=analyse_de_necessite p in print_prog p'; nouvelle_section "Tri topologique du graphe contracté des appels de fonctions"; let tri_cc = tri_typage p' in do_list (function l-> print_string "[";do_list print_string l;print_string "]") tri_cc; print_newline (); nouvelle_section "Types"; let rec imprime_types = function | [] -> () | (nom,(l,a))::q -> print_string (nom^" : "); do_list (function a->print_type a;print_string " ") l; print_string "-> "; print_type a; print_newline (); imprime_types q in let t=type_programme p' tri_cc in imprime_types (fst t); print_string "Expression : "; print_type (snd t); print_newline (); nouvelle_section "Résultat de l'interprétation du programme"; evalprog p'; let code=produit_code_programme p' in nouvelle_section "Code du programme compilé"; let I = ref 0 in while (!I <= (vect_length code)) & (code.(!I)) <> Fin do (print_int !I); (print_string " : "); (echo_instruction (code.(!I))); I := !I + 1; print_newline () done; nouvelle_section "Résultat de la compilation du programme"; executer code;; try run() with | Compilation_Necessite -> print_string "La compilation n'est pas gérée dans le cas d'arguments passés par nécessité." | Analyse -> print_string "Erreur dans l'analyse de nécessité." | Doublon -> print_string "Deux arguments ne peuvent avoir le même nom." | Inconnue v -> print_string ("Variable "^v^" inconnue.") | F_Inconnue f -> print_string ("Fonction "^f^" non définie.") | Nb_incorrect f -> print_string (f^" est appelée avec un nombre incorrect d'arguments.") | F_Doublon -> print_string "Deux fonctions ne peuvent avoir le même nom." | parsing__Parse_error -> print_string "Erreur de syntaxe." | Not_found -> print_string "Pas trouvé" | Erreur_typage -> print_string "Erreur de typage." | Production_code -> print_string "Erreur lors de la production de code." | exc__Failure s -> print_string ("Erreur : "^s);; print_newline ();;