Télécharger le script ! - mod phpBB
(* Main.ml
Crée le 16/05/2004
CALATRAVA Jérôme
CORNET Florian
ESTIENNE Sébastien
*)
(* Modules du Domaine. *)
open Cdom
open Typedom
open Valdom
(* Module pour Expression et Instruction. *)
open Langage
open Mprint
open Langage
(* Module paramétré par le Domaine ValDom. *)
module EnvValDom = Env.Env(Valdom)
module ExecValDom = Mexec.Mexec(Valdom)
(* Module paramétré par le Domaine TypeDom. *)
module EnvTypeDom = Env.Env(Typedom)
module ExecTypeDom = Mexec.Mexec(Typedom)
(* Module paramétré par le Domaine CDom. *)
module EnvCDom = Env.Env(Cdom)
module ExecCDom = Mexec.Mexec(Cdom)
(* Creation de l'environnement dans les domaine de EnvValDom, EnvTypeDom, EnvCDom. *)
let envValDom = EnvValDom.creer() ;;
let envTypeDom = EnvTypeDom.creer() ;;
let envCDom = EnvCDom.creer() ;;
(* Fonction d'affichage de l'entete. *)
let afficher_entete () =
begin
print_string( "\n" ) ;
print_string( " +---------------------------------------------+\n" ) ;
print_string( " | Interprete d'un mini langage imperatif! |\n" ) ;
print_string( " +---------------------------------------------+\n" ) ;
print_string( "\n" ) ;
end;;
(* Fonction d'affichage du menu programme. *)
let afficher_menu_pgm () =
begin
print_string( "Choisissez un programme : \n" ) ;
print_string( " 1. Pgm 1 (test1:While)\n" ) ;
print_string( " 2. Pgm 2 (test2:While)\n" ) ;
print_string( " 3. Pgm 3 (test3:While)\n" ) ;
print_string( " 4. Pgm 4 (If & Affect)\n" ) ;
print_string( " 5. Pgm 5 (If & Affect)\n" ) ;
print_string( " 6. Pgm 6 (Somme & Produit)\n" ) ;
print_string( " 7. Pgm 7 (Somme & Produit)\n" ) ;
print_string( " 8. Pgm 8 (Des Tests)\n" ) ;
print_string( " 9. Pgm 9 (Des Tests)\n" ) ;
print_string( " 10. Pgm 10 (While imbrique)\n" ) ;
print_string( "\n" ) ;
print_string( " 0. Quitter\n" ) ;
end;;
(* Fonction d'affichage du menu environnement. *)
let afficher_menu_env () =
begin
print_string( "Choisissez un environnement : \n" ) ;
print_string( " 1. Executer dans ValDom\n" ) ;
print_string( " 2. Executer dans TypeDom\n" ) ;
print_string( " 3. Executer dans NPDom\n" ) ;
print_string( "\n" ) ;
print_string( " 0. Annuler\n" ) ;
end;;
(* Programme1 : test1 -> While. *)
let inst1 = Declare("s",Entier(0),
Declare("x",Entier(0),
Seq(While(Egal(Egal(Variable("x"),Entier(5)),Faux),
Seq(Affect("s", Somme(Variable("s"),Variable("x"))),
Affect("x",Somme(Variable("x"),Entier(1))))),
Trace("apres While de test1:")))) ;;
(* Programme2 : test2 -> While. *)
let inst2 = Declare("s",Entier(0),
Declare("x",Entier(1),
Seq(While(Egal(Egal(Variable("x"),Entier(0)),Faux),
Seq(Affect("s",Somme(Variable("s"),Variable("x"))),
Affect("x",Somme(Variable("x"),Entier(1))))),
Trace("apres While de test2:")))) ;;
(* Programme3 : test3 -> While. *)
let inst3 = Declare("s",Entier(0),
Declare("x",Entier(1),
Seq(While(Egal(Egal(Variable("x"),Entier(0)),Faux),
Seq(Affect("s",Somme(Variable("s"),Variable("x"))),
Affect("x",Somme(Variable("x"),Entier(1))))),
Affect("x",Somme(Variable("x"),Vrai))))) ;;
(* Programme4 : If & Affect. *)
let inst4 = Declare("x",Entier(1),
Declare("y",Entier(3),
Declare("z",Entier(5),
Seq(If(Egal(Variable("x"),Entier(0)),
Affect("x",Variable("y")),
Affect("x",Variable("z"))),
Trace("Etat de l'environnement : "))))) ;;
(* Programme5 : If & Affect. *)
let inst5 = Declare("x",Entier(7),
Declare("b",Vrai,
Seq(If(Egal(Variable("x"),Variable("b")),
Affect("b",Faux),
Affect("b",Variable("b"))),
Seq(Affect("x",Vrai),
Trace("Etat de l'environnement : "))))) ;;
(* Programme6 : Somme & Produit. *)
let inst6 = Declare("x",Entier(3),
Declare("y",Entier(-5),
Declare("z",Entier(7),
Declare("somme",Entier(0),
Declare("produit",Entier(0),
Seq(Affect("somme",Somme(Variable("x"),Variable("y"))),
Seq(Affect("produit",Produit(Variable("y"),Variable("z"))),
Trace("Etat de l'environnement : ")))))))) ;;
(* Programme7 : Somme & Produit. *)
let inst7 = Declare("x",Entier(3),
Declare("y",Entier(-5),
Declare("b",Faux,
Declare("somme",Entier(0),
Declare("produit",Entier(0),
Seq(Affect("somme",Somme(Variable("x"),Variable("b"))),
Seq(Affect("produit",Produit(Variable("y"),Variable("b"))),
Trace("Etat de l'environnement : ")))))))) ;;
(* Programme8 : Des tests. *)
let inst8 = Declare("x",Entier(2),
Seq(If(Egal(Variable("x"),Entier(2)),
Affect("x",Entier(0)),
Affect("x",Entier(-4))),
Trace("\nEtat de l'environnement : "))) ;;
(* Programme9 : Des tests. *)
let inst9 = Declare("b",Faux,
Seq(Affect("b",Somme(Entier(-2),Entier(1))),
Trace("\nEtat de l'environnement : "))) ;;
(* Programme10 : test10 -> While. *)
let inst10 = Declare("s",Entier(0),
Declare("x",Entier(0),
Seq(While(Egal(Egal(Variable("x"),Entier(5)),Faux),
Seq(Affect("s", Somme(Variable("s"),Variable("x"))),
Seq(Declare("y",Entier(0),
While(Egal(Egal(Variable("s"),Variable("y")),Vrai),
Seq(Affect("y",Entier(10)),Affect("s",Somme(Variable("y"),Entier(1)))))),
Affect("x",Somme(Variable("x"),Entier(1)))))),
Trace("apres While de test1:")))) ;;
(* Fonction affichant le code source d'un programme. *)
let afficher_pgm = function
1 -> begin print_string( "test1 = \n{\n"^(Mprint.printinst inst1)^"\n}") ; end
|2 -> begin print_string( "test2 = \n{\n"^(Mprint.printinst inst2)^"\n}") ; end
|3 -> begin print_string( "test3 = \n{\n"^(Mprint.printinst inst3)^"\n}") ; end
|4 -> begin print_string( "pgm4 = \n{\n"^(Mprint.printinst inst4)^"\n}") ; end
|5 -> begin print_string( "pgm5 = \n{\n"^(Mprint.printinst inst5)^"\n}") ; end
|6 -> begin print_string( "pgm6 = \n{\n"^(Mprint.printinst inst6)^"\n}") ; end
|7 -> begin print_string( "pgm7 = \n{\n"^(Mprint.printinst inst7)^"\n}") ; end
|8 -> begin print_string( "test8 = \n{\n"^(Mprint.printinst inst8)^"\n}") ; end
|9 -> begin print_string( "test9 = \n{\n"^(Mprint.printinst inst9)^"\n}") ; end
|10 -> begin print_string( "test10 = \n{\n"^(Mprint.printinst inst10)^"\n}") ; end
|_ -> begin print_string( "default = \n{\n trace(\"Etat de l'environnement : \");\n}" ) ; end;;
(* Reinitialisation des environnements. *)
let initialiser_env () =
begin
envValDom = EnvValDom.creer() ;
envTypeDom = EnvTypeDom.creer() ;
envCDom = EnvCDom.creer() ;
end;;
(* Fonction lancant le système de menu. *)
let lancer () =
begin
(* afficher l'entete *)
afficher_entete() ;
(* initialiser le no du pdm *)
let no_pgm = ref (-1) in
(* rentrer dans la boucle de menu *)
while !no_pgm != 0 do
(* afficher le menu des programmes *)
afficher_menu_pgm() ;
(* demander le choix (no pgm) a l'utilisateur *)
print_string( "\nVotre choix : " ) ;
(* lire la valeur entree par l'utilisateur *)
no_pgm := read_int() ;
(* redemander le choix (no pgm) tant qu'il n'est pas correct *)
while !no_pgm < 0 || !no_pgm > 10 do
print_string( "Choix incorrect!\nVotre choix : " ) ;
no_pgm := read_int() ;
done ;
(* on continue *)
if !no_pgm != 0 then
begin
(* afficher le code source du programme choisi *)
afficher_pgm !no_pgm ;
print_newline() ;
(* afficher le menu environnement *)
afficher_menu_env() ;
(* initialiser le no de l'env *)
let no_env = ref (-1) in
(* demander le choix (no env) a l'utilisateur *)
print_string( "\nVotre choix : " ) ;
(* lire la valeur entree par l'utilisateur *)
no_env := read_int() ;
(* redemander le choix (no env) tant qu'il n'est pas correct *)
while !no_env < 0 || !no_env > 3 do
print_string( "Choix incorrect!\nVotre choix : " ) ;
no_env := read_int() ;
done ;
(* on continue *)
if !no_env != 0 then
begin
(* reinitialiser les environnements *)
initialiser_env() ;
(* executer le programme *)
print_string( "\nExecution ..." ) ;
if !no_env = 1 then (* Env ValDom *)
begin
if !no_pgm = 1 then ExecValDom.exec envValDom inst1
else if !no_pgm = 2 then ExecValDom.exec envValDom inst2
else if !no_pgm = 3 then ExecValDom.exec envValDom inst3
else if !no_pgm = 4 then ExecValDom.exec envValDom inst4
else if !no_pgm = 5 then ExecValDom.exec envValDom inst5
else if !no_pgm = 6 then ExecValDom.exec envValDom inst6
else if !no_pgm = 7 then ExecValDom.exec envValDom inst7
else if !no_pgm = 8 then ExecValDom.exec envValDom inst8
else if !no_pgm = 9 then ExecValDom.exec envValDom inst9
else ExecValDom.exec envValDom inst10
end
else
envValDom ;
if !no_env = 2 then (* Env TypeDom *)
begin
if !no_pgm = 1 then ExecTypeDom.exec envTypeDom inst1
else if !no_pgm = 2 then ExecTypeDom.exec envTypeDom inst2
else if !no_pgm = 3 then ExecTypeDom.exec envTypeDom inst3
else if !no_pgm = 4 then ExecTypeDom.exec envTypeDom inst4
else if !no_pgm = 5 then ExecTypeDom.exec envTypeDom inst5
else if !no_pgm = 6 then ExecTypeDom.exec envTypeDom inst6
else if !no_pgm = 7 then ExecTypeDom.exec envTypeDom inst7
else if !no_pgm = 8 then ExecTypeDom.exec envTypeDom inst8
else if !no_pgm = 9 then ExecTypeDom.exec envTypeDom inst9
else ExecTypeDom.exec envTypeDom inst10
end
else
envTypeDom ;
if !no_env = 3 then (* Env CDom *)
begin
if !no_pgm = 1 then ExecCDom.exec envCDom inst1
else if !no_pgm = 2 then ExecCDom.exec envCDom inst2
else if !no_pgm = 3 then ExecCDom.exec envCDom inst3
else if !no_pgm = 4 then ExecCDom.exec envCDom inst4
else if !no_pgm = 5 then ExecCDom.exec envCDom inst5
else if !no_pgm = 6 then ExecCDom.exec envCDom inst6
else if !no_pgm = 7 then ExecCDom.exec envCDom inst7
else if !no_pgm = 8 then ExecCDom.exec envCDom inst8
else if !no_pgm = 9 then ExecCDom.exec envCDom inst9
else ExecCDom.exec envCDom inst10
end
else
envCDom ;
(* attend que l'utilisateur appuie sur entree *)
print_string( "\nAppuyez sur entree pour continuer!\n" ) ;
let s = ref "" in s := read_line() ;
end
end
done ;
end;;
(* Lancer la demo. *)
lancer() ;;