theorie du chaos morte et enterrée | 
  -------------------------------------------------------------------------------
 --  Environ : specification du paquetage
 --
 --  Historique :
 --     14/12/2003
 --        - version initiale
 -------------------------------------------------------------------------------
   --|  Ce module gere UN environnement, permettant d'associer
 --|  des defns a des strings representant des identificateurs.
 --|  Cette association est temporaire, le temps d'analyser un bloc
 --|  de defns (programme, procedure, fonction).
   --|  L'environnement est defini comme une pile de blocs. La pile doit
 --|  pouvoir contenir au moins 3 blocs. L'implantation peut fixer un
 --|  nombre maximum de blocs empilables (cf. commentaire de Entrer_Bloc).
   --|  La procedure Initialiser_Environ doit avoir ete appelee (une seule fois)
 --|  avant tout appel aux primitives de l'environnement.   --|  Apres cet appel, la pile est vide.
     --|  Le bloc "courant" est le bloc en sommet de pile.
   --|  Le plus souvent, l'environnement contiendra 2 ou 3 blocs :
 --|  . le bloc des predefinis (en fond de pile)
 --|  . le bloc des identificateurs globaux
 --|  . le bloc des identificateurs locaux eventuellement (en sommet de pile)
 --|  D'autres blocs sont empiles pour la gestion des instructions 'for'
     --|  Il ne peut y avoir qu'au plus une defn associee a une chaine C
 --|  dans un bloc empile.
 --|  La defn "visible" pour une chaine C, si elle existe, est
 --|  la premiere defn obtenue en consultant les blocs empiles,
 --|  dans l'ordre du sommet vers le fond de la pile.
   with Types_Base,Pile_p,Defns;
 use  Types_Base,Pile_p,Defns;
   package Environ is
      procedure Initialiser_Environ;
    -- configure la pile
      procedure Enrichir_Bloc_Courant (D1      : Defn;
                                     Present :    out Boolean;
                                     D2      :    out Defn);
    -- Cherche si Acces_String (Acces_Nom (D1)) est associee a une defn D
    -- dans le bloc courant :
    -- . si oui, Present := True et D2 := D;
    -- . si non, Present := False, D1 est rentree dans le bloc courant,
    --   et D2 := D1.
    -- Precondition : la pile des blocs n'est pas vide;
      procedure Enrichir_Bloc_Global (D1      : Defn;
                                    Present :    out Boolean;
                                    D2      :    out Defn);
    -- Cherche si Acces_String (Acces_Nom (D1)) est associee a une defn D
    -- dans le bloc global :
    -- . si oui, Present := True et D2 := D;
    -- . si non, Present := False, D1 est rentree dans le bloc global,
    --   et D2 := D1.
    -- Utile lorsque l'on veut mettre a jour le bloc global, alors
    -- que le bloc courant est un bloc local (par ex : defn de procedure
    -- apres analyse de ses parametres).
    -- Precondition : il y a exactement trois blocs dans la pile
      function Recherche (C : access St_Chaine) return Defn;
    -- Retourne la defn visible associee a Acces_String (C), s'il y en a une;
    -- retourne null sinon.
    -- Precondition : la pile des blocs n'est pas vide.
      procedure Entrer_Bloc;
    -- Empile un nouveau bloc (vide).
    -- Leve Erreur_Environ en cas de depassement des limites de l'implantation
      procedure Sortir_Bloc;
    -- Enleve le dernier bloc empile (ses defns ne sont donc plus
    -- accessibles via l'environnement).
    -- Precondition : il y a au moins un bloc dans la pile.
      generic
       with procedure Traiter (D : access St_Defn);
    procedure Parcourir_Bloc_Courant;      -- Appelle Traiter sur chacune des defns du bloc courant
    -- (dans un ordre quelconque).
    -- Precondition : la pile des blocs n'est pas vide.
    
    Erreur_Environ : exception;
   end Environ;
   |  
 
  -------------------------------------------------------------------------------
 --  Tables : specification du paquetage   --
 --  Historique :
 --     14/12/2003
 --        - version initiale
 -------------------------------------------------------------------------------
   --|  Specification des types abstraits Table et Element_Table
   --|  Une table permet d'associer des informations a une chaine
 --|  et de retrouver ces informations en temps quasi-constant.
   with Types_Base;
 use  Types_Base;
 generic
      type Info is private;
    -- L'information associee a une chaine
      Info_Vide : in Info;
    -- La valeur par defaut de l'information associee a une chaine
   package Tables is
      -- ***** Types *****
      -- Le type abstrait Table.
      type St_Table (<> ) is limited private;
    type Table is access all St_Table;
      -- Le type abstrait Element_Table.
    -- Un element de table est un couple (chaine, info).
      type St_Element_Table (<> ) is limited private;
    type Element_Table is access all St_Element_Table;
        -- ***** Constructeurs *****
      function Creation (Taille : Positive) return Table;
    -- Delivre une nouvelle table, sans information;
    -- Taille est une estimation du nombre d'informations a gerer,
    -- permettant d'ajuster la taille de la table delivree.
        -- ***** Selecteurs *****
      function Acces_Chaine (E : access St_Element_Table) return Chaine;
    -- Retourne la chaine associee a E.
      function Acces_Info (E : access St_Element_Table) return Info;
    -- Retourne l'info associee a E.
        -- ***** Mutateurs *****
      procedure Changer_Info (E : access St_Element_Table; I : in Info);
    -- Modifie l'info associee a E.
        -- ***** Divers *****
      procedure Chercher (T       : access St_Table;
                        S       : in     String;
                        A_Creer : in     Boolean := False;
                        Present :    out Boolean;
                        E       :    out Element_Table);
    -- Recherche S dans T.
    -- Si elle y est deja, Present := True et E := l'element de T tel que
    --    Acces_String (Acces_Chaine (E)) = S
    -- Sinon, Present := False, et
    --    . si A_Creer = True, une nouvelle chaine C est creee, telle que
    --      Acces_String (C) = S, et un nouvel element E est ajoute dans T
    --      tel que Acces_Chaine (E) = C et Acces_Info (E) = Info_Vide
    --    . sinon, E := null.
    -- Precondition : S /= "" (leve Erreur_Table sinon)
    -- N.B. cout quasi constant si T est bien configuree.
      procedure Chercher (T       : access St_Table;
                        C       : access St_Chaine;
                        A_Creer : in     Boolean := False;
                        Present :    out Boolean;
                        E       :    out Element_Table);
    -- Recherche Acces_String (C) dans T.
    -- Si elle y est deja, Present := True et E := l'element de T tel que
    --    Acces_String (Acces_Chaine (E)) = Acces_String (C)
    -- Sinon, Present := False, et
    --    . si A_Creer = True, un nouvel element E est ajoute dans T
    --      tel que Acces_Chaine (E) = C et Acces_Info (E) = Info_Vide.
    --      (bien noter que C est stockee dans E sans dupliquer
    --      ses caracteres : cela rend cette procedure Chercher plus
    --      efficace que la precedente, si l'on dispose deja d'une chaine)
    --    . sinon, E := null.
    -- Precondition : Acces_String (C) /= "" (leve Erreur_Table sinon)
    -- N.B. cout quasi constant si T est bien configuree.
      procedure Retirer (T : access St_Table; E : access St_Element_Table);
    -- Supprime E de la table T, c.a.d. que la chaine Acces_Chaine (E) et
    -- l'information Acces_Info (E) ne font plus partie de T.
    -- Precondition : E fait partie de T (leve Erreur_Table sinon)
    -- N.B. Cette operation peut avoir un cout dependant
    --      du nombre d'elements de T.
      procedure Retirer (T : access St_Table; C : access St_Chaine);
    -- Supprime C de la table T, ainsi que l'information associee a C.
    -- Precondition : C fait partie de T, c.a.d. il existe un element
    --                E de T, tel que Acces_Chaine (E) = C
    --                (leve Erreur_Table sinon)
    -- N.B. Cette operation peut avoir un cout dependant du nombre d'elements
    --      de T, et peut etre moins efficace que l'autre procedure Retirer.
        -- ***** Iterateurs *****
      generic
       with procedure Traiter (E : access St_Element_Table);
    procedure Parcourir (T : access St_Table);
    -- Appelle Traiter sur chacun des elements de la table T.
    -- L'ordre des differents appels a Traiter n'est pas defini.
        -- ***** Exceptions *****
      Erreur_Table : exception; -- Levee par Chercher, Retirer
   private
      type St_Table is array (Natural range <> ) of Element_Table;
      type St_Element_Table is
       record
          La_Chaine : Chaine;
          L_Info : Info;
          Suiv : Element_Table;
       end record;
   end Tables;
   |  
 
     |