Coloration Syntaxique

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() ;;
90373 octets
295 lignes générées en 0.03788 secondes,
soit une vitesse de 7761 lignes par seconde

Apache/2.4.59 (Debian)

Texte à analyser:

Langage :