DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦8ad845d73⟧ Ada Source

    Length: 30720 (0x7800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Syn, seg_03ee0a

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io, Lex, Error;
use Text_Io, Lex, Error;
package body Syn is

    function Instructions_Simples return Boolean;
    function Expression return Boolean;

    function Type_Base return Boolean is
        Ok : Boolean := True;
    begin
        case Lex.Get_Token is
            when Entier | Chaine | Identifier =>
                Lex.Next;
            when others =>
                Ok := False;
                Error.Syn (Type_Base, Follow_Type_Base);
        end case;
        return Ok;
    end Type_Base;


    function Type_Structure return Boolean is
        Ok : Boolean := True;
    begin
        case Lex.Get_Token is
            when Anime | Lieu | Entite | Identifier =>
                Lex.Next;
            when others =>
                Ok := False;
                Error.Syn (Type_Structure, Follow_Type_Structure);
        end case;
        return Ok;
    end Type_Structure;


    function Chaine return Boolean is       Ok : Boolean := True;
    begin
        while Lex.Get_Token = Ampersand loop
            Lex.Next;
            if Lex.Get_Token /= Right_Sentence then
                Ok := False;
                Error.Syn (Chaine, Follow_Chaine);
            else
                Lex.Next;
            end if;
        end loop;
        return Ok;
    end Chaine;


    function Valeur return Boolean is
        Ok : Boolean := True;
    begin
        case Lex.Get_Token is
            when Number | Identifier =>
                Lex.Next;
            when Right_Sentence =>
                Lex.Next;
                Ok := Ok and Chaine;
            when others =>
                Ok := False;
                Error.Syn (Valeur, Follow_Valeur);
        end case;
        return Ok;
    end Valeur;


    function Objet return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when Identifier | Heros | Lieu =>
                Lex.Next;
            when others =>
                Ok := False;
                Error.Syn (Objet, Follow_Objet);
        end case;
        return Ok;
    end Objet;


    function Liste_Identificateurs return Boolean is
        Ok : Boolean := True;
    begin
        if Lex.Get_Token = Identifier then
            Lex.Next;
            while Lex.Get_Token = Comma loop
                Lex.Next;
                if Lex.Get_Token /= Identifier then
                    Ok := False;
                    Error.Syn (Identifier, Follow_Liste_Identificateurs);
                else
                    Lex.Next;
                end if;
            end loop;
        else
            Ok := False;
            Error.Syn (Identifier, Follow_Liste_Identificateurs);
        end if;
        return Ok;
    end Liste_Identificateurs;

    function Liste_Messages_Erreur return Boolean is
        Ok : Boolean := True;
    begin
        while Lex.Get_Token = Message loop
            Lex.Next;
            if Lex.Get_Token = Erreur then
                Lex.Next;
                if Lex.Get_Token = Right_Sentence then
                    Lex.Next;
                    Ok := Ok and Chaine;
                else
                    Ok := False;  
                    if Lex.Get_Token = Wrong_Sentence then
                        Error.Syn (Wrong_Sentence,
                                   Follow_Liste_Messages_Erreur);
                    else
                        Error.Syn (Sentence, Follow_Liste_Messages_Erreur);
                    end if;
                end if;
            else
                Ok := False;
                Error.Syn (Erreur, Follow_Liste_Messages_Erreur);
            end if;
        end loop;
        return Ok;
    end Liste_Messages_Erreur;

    function Liste_Enumeres return Boolean is
        Ok : Boolean := True;
    begin
        while Lex.Get_Token = Enumere loop
            Lex.Next;
            if Lex.Get_Token = Identifier then
                Lex.Next;
                if Lex.Get_Token = Colon then
                    Lex.Next;
                    Ok := Ok and Liste_Identificateurs;
                else
                    Ok := False;
                    Error.Syn (Colon, Follow_Liste_Enumeres);
                end if;
            else
                Ok := False;
                Error.Syn (Idenifier, Folow_Liste_Enumeres);
            end if;
        end loop;
        return Ok;
    end Liste_Enumeres;
                                                 
    
    function Attribut return Boolean is 
      Ok : Boolean := True
   begin
      Ok := Ok and type_base;
      if lex.Get_token = colon then
        lex.Next;
        if Lex.Get_Token = Identifier then
            Lex.Next;
            if Lex.Get_Token = Equal then
                Lex.Next;
                Ok := Ok and Valeur;
            end if;
        else
            Ok := False;
            Error.syn(identifier, follow_attribut);
      else
        ok := false;
        error.syn(colon, follow_attribut);
      return Ok;
   end Attribut;
    
    function Corps_Structure return Boolean is
      Ok : Boolean := True;
   begin
      if Lex.Get_Token = Avec then
         lex.Next;
         if Lex.Get_Token = En then
            Ok := Ok and Attribut;
            while Lex.Get_Token = En loop
               Lex.Next;
               Ok := Ok and Attribut;
            end loop;
         else
            Ok := False;
            Error.syn(en, follow_attribut);
         end if;
      end if;
   return Ok;
   end Corps_Structure;

    function Liste_Structures return Boolean is
        Ok : Boolean := True;
    begin
        while Lex.Get_Token = Structure loop
            Lex.Next;
            if Lex.Get_Token = Identifier then
                Lex.Next;
                if Lex.Get_Token = Est then
                    Lex.Next;
                    Ok := Ok and Type_Structure;
                    Ok := Ok and Corps_Structure;
                else
                    Ok := False;
                    Error.Syn (Est, Follow_Liste_Structures);
                end if;
            else
                Ok := False;
                Error.Syn (Identifier, Follow_Liste_Structures);
            end if;
        end loop;
        return Ok;
    end Liste_Structures;
                               
    function champ return boolean is
    ok : boolean := true;
    begin
        if lex.get_token = equal then
            lex.next;
            ok := ok and valeur;
        else
            ok := false;
            error.syn(equal, follow_champs);
        end if;
        return ok;
    end champ;
                
    function Champs return Boolean is
      Ok : Boolean := True;
   begin
      if Lex.Get_Token = Avec then
         Lex.Next;        
            lex.next;
            if lex.get_token = identifier then
                lex.next;
                ok := ok and champ;
            else
                ok := false;
                error.syn(identifier, follow_champs);
           end if;
           while Lex.Get_Token = Identifier loop
               Lex.Next;
               ok := ok and champ;
         end loop;
      end if; 
      return Ok;
   end Champs;
    
   
   function Issues return Boolean is
      Ok : Boolean := True;
   begin
      if Lex.Get_Token = Issues then
         Lex.Next;
         if Lex.Get_Token = Equal then
            Lex.Next;
            if Lex.Get_Token = Number then
               Lex.Next;
            else
               Ok := False;
               Error.syn(number, follow_issues);
            end if;
         else
            Ok := False;
            Error.syn(equal, follow_issues);
         end if;
      end if;
      return Ok;
   end Issues;
                  
    function Mouvement return Boolean is
      Ok := Boolean := True;
   begin
      if Lex.Get_Token = Identifier then
         Lex.Next;
         if Lex.Get_Token = Colon then
            Lex.Next;
            if Lex.Get_Token = Number then
               Lex.Next;
            else
               Ok := False;
               Error.syn(number, follow_mouvement);
            end if;
         end if;
      else
         Ok := False;
         Error.syn(identificateur, follow_mouvement);
       end if;
       return Ok;
   end Mouvement;

    function Mouvements return Boolean is
      Ok : Boolean := True;
   begin
      Ok := Ok and Mouvement;
      while Lex.Get_Token = Comma loop
         Lex.Next;
         Ok := Ok and Mouvement;
      end loop;
      return Ok;
    end Mouvements;

   function Itineraire return Boolean is
      Ok : Boolean := True;
   begin
      if Lex.Get_Token = Itineraire then
         Lex.Next;
         if Lex.Get_Token = Equal then
            Lex.Next;
            Ok := Ok and Mouvements;
         else
            Ok := False;
            Error.syn(equal, follow_liste_objets);
         end if;
      end if;
      return Ok;
   end Itineraire;
  
      
  function Corps_Objet return Boolean is
      Ok : Boolean := True;
   begin
      Ok := Ok and Champs;
      Ok := Ok and Issues;
      Ok := Ok and Itineraires;
   end Corps_objet;
                  

      function liste_Objets return Boolean is
      Ok : Boolean := True;
   begin
      while Lex.Get_Token = Cree loop
         Lex.Next;
         Ok := Ok and Type_Structure;
         if Lex.Get_Token = Colon then
             Ok := Ok and Liste_Identificateurs;
             Ok := Ok and Corps_Objet;
         else
            Ok := False;
            Error.(colon, follow_liste_objets);
         end if;
      end loop;
      return Ok;
   end liste_Objets;

    function Facteur return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when Opening_Bracket =>
                Lex.Next;
                Ok := Ok and Expression;
                if Lex.Get_Token = Closing_Bracket then
                    Lex.Next;
                else
                    Ok := False;
                    Error.Syn (Closing_Bracket, Follow_Facteur);
                end if;
            when Identifier =>
                Lex.Next;
                if Lex.Get_Token = De then
                    Lex.Next;
                    Ok := Ok and Objet;
                end if;
            when Number =>
                Lex.Next;
            when others =>
                Ok := False;
                Error.Syn (Facteur, Follow_Facteur);
        end case;
        return Ok;
    end Facteur;



    function Terme return Boolean is

        First_Terme : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Multiply .. Divide => True, others => False);

        Ok : Boolean := True;

    begin
        Ok := Ok and Facteur;
        while First_Terme (Lex.Get_Token) loop
            case Lex.Get_Token is
                when Multiply | Divide =>
                    Lex.Next;
                    Ok := Ok and Facteur;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Terme;

    function Expression return Boolean is

        First_Expression : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Substract .. Add => True, others => False);

        Ok : Boolean := True;

    begin
        Ok := Ok and Terme;
        while First_Expression (Lex.Get_Token) loop
            case Lex.Get_Token is
                when Add | Substract =>
                    Lex.Next;
                    Ok := Ok and Terme;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Expression;

    function Symbole_Comparaison return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when Equal | Not_Equal | Less | Greater |
                 Greater_Equal | Less_Equal =>
                Lex.Next;
            when others =>
                Ok := False;
                Error.Syn (Symbole_Comparaison, Follow_Symbole_Comparaison);
        end case;
        return Ok;
    end Symbole_Comparaison;

    function Suite_Condition_Forte return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when De =>
                Lex.Next;
                Ok := Ok and Objet;
                Ok := Ok and Symbole_Comparaison;
                Ok := Ok and Expression;
            when Pas =>
                Lex.Next;
                if Lex.Get_Token = Dans then
                    Lex.Next;
                    Ok := Ok and Objet;
                else
                    Ok := False;
                    Error.Syn (Dans, Follow_Suite_Condition_Forte);
                end if;
            when Dans =>
                Lex.Next;
                Ok := Ok and Objet;
            when Existe =>
                Lex.Next;
                if Lex.Get_Token = Pas then
                    Lex.Next;
                end if;
            when others =>
                Ok := False;
                Error.Syn (Suite_Condition_Forte, Follow_Suite_Condition_Forte);
        end case;
        return Ok;
    end Suite_Condition_Forte;

    function Condition_Forte return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when Identifier =>
                Lex.Next;
                Ok := Ok and Suite_Condition_Forte;
            when Heros | Lieu =>
                Lex.Next;
                if Lex.Get_Token = Equal then
                    Lex.Next;
                    if Lex.Get_Token = Identifier then
                        Lex.Next;  
                    else
                        Ok := False;
                        Error.Syn (Identifier, Follow_Condition_Forte);
                    end if;
                else
                    Ok := False;
                    Error.Syn (Equal, Follow_Condition_Forte);
                end if;
            when Number =>
                Lex.Next;
                if Lex.Get_Token = Actions then
                    Lex.Next;
                    if Lex.Get_Token = Passees then
                        Lex.Next;  
                    else
                        Ok := False;
                        Error.Syn (Passees, Follow_Condition_Forte);
                    end if;
                else
                    Ok := False;
                    Error.Syn (Actions, Follow_Condition_Forte);
                end if;
            when Rencontre =>
                Lex.Next;
                if Lex.Get_Token = Identifier then
                    Lex.Next;  
                else
                    Ok := False;
                    Error.Syn (Identifier, Follow_Condition_Forte);
                end if;
            when others =>
                Ok := False;
                Error.Syn (Condition_Forte, Follow_Condition_Forte);
        end case;
        return Ok;
    end Condition_Forte;


    function Condition_Faible return Boolean is

        First_Condition_Faible : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Et => True, others => False);

        Ok : Boolean := True;

    begin
        Ok := Ok and Condition_Forte;
        while First_Condition_Faible (Lex.Get_Token) loop-- a simplifier
            case Lex.Get_Token is
                when Et =>  
                    Ok := Ok and Condition_Forte;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Condition_Faible;

    function Condition return Boolean is

        First_Condition : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Ou => True, others => False);

        Ok : Boolean := True;

    begin
        Ok := Ok and Condition_Faible;
        while First_Condition (Lex.Get_Token) loop-- a simplifier
            case Lex.Get_Token is
                when Ou =>  
                    Ok := Ok and Condition_Faible;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Condition;

    function Si return Boolean is

        Ok : Boolean := True;

    begin
        Ok := Ok and Condition; -- synchronise sur alors
        if Lex.Get_Token = Alors then
            Lex.Next;
            Ok := Ok and Instructions_Simples; --synchronise sur fin
            if Lex.Get_Token = Fin then
                Lex.Next;
                if Lex.Get_Token = Si then
                    Lex.Next;
                else
                    Ok := False;
                    Error.Syn (Si, Follow_Instruction_Simple);
                end if;
            else
                Ok := False;
                Error.Syn (Fin, Follow_Instruction_Simple);
            end if;  
        else
            Ok := False;
            Error.Syn (Alors, Follow_Instruction_Simple);
        end if;
        return Ok;
    end Si;

    function Change return Boolean is

        Ok : Boolean := True;

    begin
        case Lex.Get_Token is
            when Identifier =>
                Lex.Next;
                if Lex.Get_Token = De then
                    Lex.Next;
                    Ok := Ok and Objet;
                    if Lex.Get_Token = En then
                        Lex.Next;
                        Put_Line ("ch ex 1");
                        Ok := Ok and Expression;
                        Put_Line ("ch ex 2");
                    else
                        Put_Line ("ch en");
                        Ok := False;
                        Error.Syn (En, Follow_Instruction_Simple);
                    end if;
                else
                    Ok := False;
                    Error.Syn (De, Follow_Instruction_Simple);
                end if;
            when Heros | Lieu =>
                Lex.Next;
                if Lex.Get_Token = En then
                    Lex.Next;
                    if Lex.Get_Token = Identifier then
                        Lex.Next;
                    else
                        Ok := False;
                        Error.Syn (Identifier, Follow_Instruction_Simple);
                    end if;
                else
                    Ok := False;
                    Error.Syn (En, Follow_Instruction_Simple);
                end if;
            when others =>
                Ok := False;
                Error.Syn (Change, Follow_Instruction_Simple);
        end case;
        return Ok;
    end Change;

    function Quoi_Afficher return Boolean is

        Ok : Boolean := True;

    begin  
        case Lex.Get_Token is
            when Right_Sentence =>
                Lex.Next;
            when Wrong_Sentence =>  
                Ok := False;
                Error.Syn (Wrong_Sentence, Follow_Quoi_Afficher);  
            when Number =>  
                Lex.Next;
            when Identifier =>
                Lex.Next;
                if Lex.Get_Token = De then
                    Lex.Next;
                    Ok := Ok and Objet;
                else
                    Ok := False;
                    Error.Syn (De, Follow_Quoi_Afficher);
                end if;
            when Issue =>
                Lex.Next;
                if Lex.Get_Token = Identifier then
                    Lex.Next;
                else
                    Ok := False;
                    Error.Syn (Identifier, Follow_Quoi_Afficher);
                end if;  
            when Issues =>  
                Lex.Next;
            when Contenu =>
                Lex.Next;
                if Lex.Get_Token = De then
                    Lex.Next;
                    Ok := Ok and Objet;  
                else
                    Ok := False;
                    Error.Syn (De, Follow_Quoi_Afficher);
                end if;  
            when others =>
                Ok := False;
                Error.Syn (Quoi_Afficher, Follow_Quoi_Afficher);
        end case;
        return Ok;  
    end Quoi_Afficher;


    function Liste_Affiche return Boolean is

        First_Liste_Affiche : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Ampersand => True, others => False);

        Ok : Boolean := True;

    begin  
        Ok := Ok and Quoi_Afficher;
        while (First_Liste_Affiche (Lex.Get_Token)) loop -- a simplifier
            case Lex.Get_Token is
                when Ampersand =>
                    Lex.Next;
                    Ok := Ok and Quoi_Afficher;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Liste_Affiche;

    function Ligne return Boolean is

        Ok : Boolean := True;

    begin
        if Lex.Get_Token = Suivante then
            Lex.Next;
        else
            Ok := False;
            Error.Syn (Suivante, Follow_Instruction_Simple); -- suivante inutile
        end if;
        return Ok;
    end Ligne;

    function Bouge return Boolean is

        Ok : Boolean := True;

    begin
        if Lex.Get_Token = Anime then
            Lex.Next;
        else
            Ok := False;
            Error.Syn (Anime, Follow_Instruction_Simple); -- anime inutile
        end if;
        return Ok;
    end Bouge;

    function Place return Boolean is

        Ok : Boolean := True;

    begin
        Ok := Ok and Liste_Identificateurs; -- synchronise sur dans
        if Lex.Get_Token = Dans then
            Lex.Next;
            Ok := Ok and Objet;
        else
            Ok := False;
            Error.Syn (Dans, Follow_Instruction_Simple); -- dans inutile
        end if;
        return Ok;
    end Place;

    function Va return Boolean is

        Ok : Boolean := True;

    begin
        if Lex.Get_Token = Vers then
            Lex.Next;
            if Lex.Get_Token = Identifier then
                Lex.Next;
            else
                Ok := False;
                Error.Syn (Identifier, Follow_Instruction_Simple);
            end if;  
        else
            Ok := False;
            Error.Syn (Vers, Follow_Instruction_Simple);
        end if;
        return Ok;
    end Va;

    function Instructions_Simples return Boolean is

        First_Instructions_Simples : constant Token_To_Boolean_Array :=
           Token_To_Boolean_Array'(Si .. Va => True, others => False);

        Ok : Boolean := True;

    begin
        while First_Instructions_Simples (Lex.Get_Token) loop
            case Lex.Get_Token is
                when Si =>
                    Lex.Next;
                    Ok := Ok and Si;
                when Change =>
                    Lex.Next;
                    Ok := Ok and Change;
                when Affiche =>
                    Lex.Next;
                    Ok := Ok and Liste_Affiche;
                when Ligne =>
                    Lex.Next;
                    Ok := Ok and Ligne;
                when Bouge =>
                    Lex.Next;
                    Ok := Ok and Bouge;
                when Place =>
                    Lex.Next;
                    Ok := Ok and Place;
                when Retire =>
                    Lex.Next;
                    Ok := Ok and Liste_Identificateurs;
                when Termine =>
                    Lex.Next;
                when Va =>
                    Lex.Next;
                    Ok := Ok and Va;
                when Efface =>
                    Lex.Next;
                when others =>
                    null;
            end case;
        end loop;
        return Ok;
    end Instructions_Simples;

    function Jeu_Aventure return Boolean is

        Ok : Boolean := True;

    begin

        Ok := Ok and Instructions_Simples;
        return Ok;
    end Jeu_Aventure;

    procedure Start is
    begin

        Lex.Initialize;
        if Jeu_Aventure then
            Put_Line ("Sentence is Ok");
        else
            Put_Line ("Sentence is false");
        end if;
    end Start;

end Syn;

E3 Meta Data

    nblk1=1d
    nid=c
    hdr6=34
        [0x00] rec0=26 rec1=00 rec2=01 rec3=002
        [0x01] rec0=26 rec1=00 rec2=13 rec3=054
        [0x02] rec0=22 rec1=00 rec2=02 rec3=016
        [0x03] rec0=1b rec1=00 rec2=16 rec3=054
        [0x04] rec0=1f rec1=00 rec2=17 rec3=020
        [0x05] rec0=24 rec1=00 rec2=0a rec3=028
        [0x06] rec0=21 rec1=00 rec2=06 rec3=00c
        [0x07] rec0=24 rec1=00 rec2=05 rec3=004
        [0x08] rec0=26 rec1=00 rec2=0e rec3=026
        [0x09] rec0=25 rec1=00 rec2=0b rec3=010
        [0x0a] rec0=25 rec1=00 rec2=09 rec3=024
        [0x0b] rec0=20 rec1=00 rec2=12 rec3=030
        [0x0c] rec0=24 rec1=00 rec2=15 rec3=022
        [0x0d] rec0=20 rec1=00 rec2=0d rec3=016
        [0x0e] rec0=1a rec1=00 rec2=14 rec3=01e
        [0x0f] rec0=1e rec1=00 rec2=0f rec3=016
        [0x10] rec0=24 rec1=00 rec2=11 rec3=00a
        [0x11] rec0=20 rec1=00 rec2=10 rec3=014
        [0x12] rec0=19 rec1=00 rec2=1a rec3=028
        [0x13] rec0=20 rec1=00 rec2=19 rec3=018
        [0x14] rec0=1d rec1=00 rec2=1d rec3=078
        [0x15] rec0=28 rec1=00 rec2=07 rec3=02c
        [0x16] rec0=25 rec1=00 rec2=18 rec3=042
        [0x17] rec0=1f rec1=00 rec2=08 rec3=01a
        [0x18] rec0=28 rec1=00 rec2=03 rec3=010
        [0x19] rec0=01 rec1=00 rec2=04 rec3=000
        [0x1a] rec0=00 rec1=00 rec2=00 rec3=000
        [0x1b] rec0=00 rec1=00 rec2=00 rec3=000
        [0x1c] rec0=00 rec1=00 rec2=00 rec3=000
    tail 0x2173e71f28605543c690c 0x42a00088462060003
Free Block Chain:
  0xc: 0000  00 1b 03 fc 80 1c 20 20 20 20 20 20 20 4f 6b 20  ┆             Ok ┆
  0x1b: 0000  00 1c 01 f1 80 13 6c 6c 6f 77 5f 6c 69 73 74 65  ┆      llow_liste┆
  0x1c: 0000  00 00 00 04 80 01 6e 01 00 00 00 40 00 00 00 3d  ┆      n    @   =┆