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

⟦37b2a5ee5⟧ Ada Source

    Length: 19456 (0x4c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lex, seg_030fad

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 Token;
with Text_Io;
with Personnal_String;


package body Lex is
    The_File : Text_Io.File_Type;
    Lookahead : Boolean := False;
    Current_Token : Token.Object;
    Current_Value : Personnal_String.Object;
    Current_Char : Character;


    type State is (St_Normal, St_Less, St_Great, St_Word, St_Heure,
                   St_Heure_Number, St_Min, St_Min_Number,
                   St_Sec, St_Number, St_Commentaire, St_Found);

    procedure Lex_Open (Nom_Fichier : String) is  
        Mode : Text_Io.File_Mode := Text_Io.In_File;
    begin
        Text_Io.Open
           (File => The_File, Mode => Mode, Name => Nom_Fichier, Form => "");
    end Lex_Open;

    function Lex_Time_Value (Stime : String) return String is
        Ptr : Integer := 1;
        Valeur : Integer := 0;

    begin  
        for I in 1 .. Stime'Length loop
            if Stime (I) in '0' .. '9' then
                null;
            else
                case Stime (I) is
                    when 'h' =>
                        Valeur :=
                           Valeur +
                              Integer'Value (Stime (Ptr .. I - 1)) * 36000;
                        Ptr := I + 1;
                    when 'm' =>  
                        Valeur := Valeur + Integer'Value
                                              (Stime (Ptr .. I - 1)) * 600;
                        Ptr := I + 1;
                    when '.' =>
                        Valeur := Valeur + Integer'Value
                                              (Stime (Ptr .. I - 1)) * 10;
                        Ptr := I + 1;
                        if Stime (Ptr) in '0' .. '9' then
                            Valeur := Valeur + Integer'Value
                                                  (Stime (Ptr .. Ptr));
                            Ptr := Ptr + 1;
                        end if;
                    when ' ' =>
                        Valeur := Valeur + Integer'Value (Stime (Ptr .. I - 1));
                        Ptr := Ptr + 1;
                    when others =>
                        null;
                end case;
            end if;
        end loop;
        return Integer'Image (Valeur);
    end Lex_Time_Value;

    procedure Lex_Close is
    begin
        Text_Io.Close (The_File);
    end Lex_Close;

    function Lex_Get_Char return Character is
    begin
        if Lookahead then
            Lookahead := False;
        else
            if Text_Io.End_Of_Line (The_File) then
                Text_Io.Skip_Line (The_File);
                Current_Char := Ascii.Cr;
            else
                Text_Io.Get (The_File, Current_Char);
            end if;
        end if;  
        return Current_Char;
    end Lex_Get_Char;

    procedure Lex_Unget is  
    begin
        Lookahead := True;
    end Lex_Unget;



    procedure Lex_Next is  
        The_Char : Character;  
        Current_State : State;
    begin
        if not Text_Io.End_Of_File (The_File) then
            Personnal_String.Raz (Current_Value);
            Current_State := St_Normal;
            while Current_State /= St_Found loop
                if not Text_Io.End_Of_File (The_File) then
                    The_Char := Lex_Get_Char;
                else
                    The_Char := Ascii.Eot;
                end if;
                case Current_State is
                    when St_Normal =>
                        case The_Char is
                            when ' ' | Ascii.Cr =>
                                null;
                            when Ascii.Eot =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Eof;
                            when '<' =>
                                Current_State := St_Less;
                            when '>' =>
                                Current_State := St_Great;
                            when '=' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Egal;
                            when ':' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Deuxpoints;
                            when ',' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Virgule;
                            when '.' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Point;
                            when '(' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Parentheseg;
                            when ')' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Parenthesed;
                            when '+' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Plus;
                            when '-' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Moins;
                            when '/' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Slash;
                            when '*' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Star;
                            when '[' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Crochetg;
                            when ']' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Crochetd;
                            when '{' =>
                                Current_State := St_Commentaire;
                            when others =>
                                if The_Char in 'a' .. 'z' then
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                    Current_State := St_Word;
                                else
                                    if The_Char in '0' .. '9' then
                                        Personnal_String.Put
                                           (Current_Value, The_Char);
                                        Current_State := St_Number;
                                    else
                                        Current_State := St_Found;
                                        Current_Token := Token.L_Unk;
                                    end if;
                                end if;
                        end case;

                    when St_Commentaire =>
                        if The_Char = '}' then
                            Current_State := St_Normal;
                        end if;

                    when St_Less =>
                        case The_Char is
                            when '=' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Inf_Ou_Egal;
                            when '>' =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Different;
                            when others =>
                                Current_State := St_Found;
                                Current_Token := Token.L_Inf;
                                Lex_Unget;
                        end case;

                    when St_Great =>
                        if The_Char = '=' then
                            Current_State := St_Found;
                            Current_Token := Token.L_Sup_Ou_Egal;
                        else
                            Current_State := St_Found;
                            Current_Token := Token.L_Sup;
                            Lex_Unget;
                        end if;

                    when St_Word =>
                        if The_Char in 'a' .. 'z' or
                           The_Char in '0' .. '9' or The_Char = '_' then
                            Personnal_String.Put (Current_Value, The_Char);
                        else  
                            Current_State := St_Found;  
                            Current_Token := Token.Search_Token
                                                (Personnal_String.Value
                                                    (Current_Value));
                            Lex_Unget;
                        end if;

                    when St_Number =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                        else
                            case The_Char is
                                when 'h' =>
                                    Current_State := St_Heure_Number;
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                when 'm' =>
                                    Current_State := St_Min_Number;
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                when '.' =>
                                    Current_State := St_Sec;
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                when others =>
                                    Current_State := St_Found;
                                    Current_Token := Token.L_Int;
                                    Lex_Unget;  
                            end case;
                        end if;

                    when St_Heure_Number =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                            Current_State := St_Heure;
                        else
                            Current_State := St_Found;
                            Current_Token := Token.L_Time;
                            Lex_Unget;
                        end if;

                    when St_Heure =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                        else
                            case The_Char is
                                when 'm' =>
                                    Current_State := St_Min_Number;
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                when '.' =>
                                    Current_State := St_Sec;
                                    Personnal_String.Put
                                       (Current_Value, The_Char);
                                when others =>
                                    Current_State := St_Found;
                                    Current_Token := Token.L_Unk;
                                    Lex_Unget;
                            end case;
                        end if;

                    when St_Min_Number =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                            Current_State := St_Min;
                        else
                            Current_State := St_Found;
                            Current_Token := Token.L_Time;
                            Lex_Unget;
                        end if;

                    when St_Min =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                        else
                            if The_Char = '.' then
                                Personnal_String.Put (Current_Value, The_Char);
                                Current_State := St_Sec;
                            else
                                Current_State := St_Found;
                                Current_Token := Token.L_Unk;
                                Lex_Unget;
                            end if;
                        end if;

                    when St_Sec =>
                        if The_Char in '0' .. '9' then
                            Personnal_String.Put (Current_Value, The_Char);
                            Current_State := St_Found;
                            Current_Token := Token.L_Time;
                        else
                            Current_State := St_Found;
                            Current_Token := Token.L_Unk;
                        end if;

                    when others =>
                        null;
                end case;
            end loop;  
        else
            Current_Token := Token.L_Eof;
        end if;

    end Lex_Next;


    function Lex_Get_Token return Token.Object is
    begin
        return Current_Token;
    end Lex_Get_Token;


    function Lex_Get_Value return Pstring is
        Ptr : Pstring;
    begin
        case Current_Token is
            when Token.L_Time =>
                Ptr := new String'(Lex_Time_Value
                                      (Personnal_String.Value (Current_Value)));
            when others =>
                Ptr := new String'(Personnal_String.Value (Current_Value));
        end case;
        return Ptr;
    end Lex_Get_Value;

    function Lex_At_End return Boolean is

    begin
        return Text_Io.End_Of_File (The_File);
    end Lex_At_End;

end Lex;

E3 Meta Data

    nblk1=12
    nid=0
    hdr6=24
        [0x00] rec0=23 rec1=00 rec2=01 rec3=020
        [0x01] rec0=00 rec1=00 rec2=09 rec3=00c
        [0x02] rec0=14 rec1=00 rec2=11 rec3=056
        [0x03] rec0=27 rec1=00 rec2=10 rec3=004
        [0x04] rec0=05 rec1=00 rec2=0a rec3=00c
        [0x05] rec0=15 rec1=00 rec2=07 rec3=00e
        [0x06] rec0=11 rec1=00 rec2=0d rec3=072
        [0x07] rec0=13 rec1=00 rec2=08 rec3=00a
        [0x08] rec0=12 rec1=00 rec2=0c rec3=060
        [0x09] rec0=16 rec1=00 rec2=12 rec3=056
        [0x0a] rec0=15 rec1=00 rec2=06 rec3=03e
        [0x0b] rec0=00 rec1=00 rec2=0b rec3=00a
        [0x0c] rec0=12 rec1=00 rec2=05 rec3=012
        [0x0d] rec0=15 rec1=00 rec2=04 rec3=03a
        [0x0e] rec0=16 rec1=00 rec2=03 rec3=006
        [0x0f] rec0=14 rec1=00 rec2=02 rec3=004
        [0x10] rec0=24 rec1=00 rec2=0e rec3=058
        [0x11] rec0=04 rec1=00 rec2=0f rec3=000
    tail 0x2172abc5e84ba4026144b 0x42a00088462060003