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

⟦b778b8623⟧ Ada Source

    Length: 22528 (0x5800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lex, seg_03729f, seg_0377c2, seg_038f57

Derivation

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

E3 Source Code



with Fichier_Io;
with Io;
with Langage;
with String_Utilities;
package body Lex is

    function Get_Line return Natural is
    begin
        return Lex_Line;
    end Get_Line;
    function Get_Token return Token is
        Car : Character;
    begin

        if Lex_Token = Special then
            Car := Bounded_String.Char_At (Lex_Value, 1);
            case Car is
                when '.' =>
                    Lex_Token := Dot;
                when '(' =>
                    Lex_Token := Open_Parenthesis;
                when ')' =>
                    Lex_Token := Close_Parenthesis;

                when '{' =>
                    Lex_Token := Open_Bracket;

                when '}' =>
                    Lex_Token := Close_Bracket;
                when others =>
                    null;
            end case;
        end if;
        if Lex_Token = Identifier then

            if (String_Utilities.Equal
                   (Bounded_String.Image (Lex_Value), "ou", True) or
                (String_Utilities.Equal
                    (Bounded_String.Image (Lex_Value), "et", True))) then
                Lex_Token := Binary_Message;
            end if;

        end if;

        return (Lex_Token);
    end Get_Token;


    function Get_Value return Lex_String is
    begin
        return (Lex_Value);
    end Get_Value;


    function In_Reserved_Word (Lex_Value : Lex_String) return Boolean is
        X : Langage.Reserved_Word;
    begin
        X := Langage.Reserved_Word'Value (Bounded_String.Image (Lex_Value));
        return (True);
    exception
        when Constraint_Error =>
            return (False);
    end In_Reserved_Word;


    procedure Spell_Reserved_Word (Lex_Value : in out Lex_String) is
        X : Langage.Reserved_Word;
    begin
        X := Langage.Reserved_Word'Value (Bounded_String.Image (Lex_Value));
        Bounded_String.Copy (Lex_Value, Langage.Reserved_Word'Image (X));
    end Spell_Reserved_Word;


    procedure Open (Name : in String) is
    begin
        Fichier_Io.Open (Fichier_Source, Name);
    end Open;


    procedure Close (Name : in String) is
    begin
        Fichier_Io.Close (Fichier_Source);
    end Close;


    procedure Next_Token is

        Current_Character : Character := ' ';
        State : State_Key := Normal;
    begin
        Bounded_String.Free (Lex_Value);

        loop
            Current_Character := Fichier_Io.Get (Fichier_Source);
            case Current_Character is

                when 'A' .. 'Z' | 'a' .. 'z' =>
                    case State is
                        when Identifier | Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Special | Operator =>
                            Fichier_Io.Unget (Fichier_Source);
                            return;
                        when Normal =>  
                            State := Identifier;
                            Lex_Token := Identifier;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Integer =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                            return;
                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            return;
                    end case;


                when '0' .. '9' =>
                    case State is
                        when Integer =>  
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Normal =>
                            State := Integer;
                            Lex_Token := Integer;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Identifier =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;


                when ':' =>
                    case State is
                        when Identifier =>
                            State := Key_Word;
                            Lex_Token := Key_Word;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;


                when '<' =>
                    case State is
                        when Normal =>
                            State := Less;  
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Less | Less_Equal | Greater_Equal |
                             Greater | Equal | Different =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;

                when '>' =>
                    case State is
                        when Normal =>
                            State := Greater;  
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Less =>
                            State := Different;
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Greater | Greater_Equal |
                             Less_Equal | Equal | Different =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;


                when '=' =>
                    case State is
                        when Normal =>
                            State := Equal;
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Less =>
                            State := Less_Equal;
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Greater =>
                            State := Greater_Equal;
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Equal | Operator =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;


                when '*' | '+' | '-' | '/' =>
                    case State is
                        when Normal =>
                            State := Operator;
                            Lex_Token := Binary_Message;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Operator | Less | Different | Greater |
                             Equal | Less_Equal | Greater_Equal =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;


                when '{' | '}' | '(' | ')' | '.' =>
                    case State is
                        when Normal =>
                            State := Special;
                            Lex_Token := Special;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;
                when ' ' =>
                    case State is
                        when Normal =>
                            null;
                        when Special | Different | Less | Greater |
                             Equal | Less_Equal | Greater_Equal |
                             Integer | Key_Word | Operator =>
                            State := Found;
                            return;
                        when Identifier =>
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;  
                            State := Found;
                            return;
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);

                        when others =>

                            State := Unknown;
                            Lex_Token := Unknown;
                            return;
                    end case;




                when Ascii.Cr | Ascii.Ht | Ascii.Lf =>  
                    Lex_Line := Lex_Line + Natural (1);
                    case State is
                        when Normal =>
                            null;
                        when Special | Different | Less | Greater |
                             Equal | Less_Equal | Greater_Equal |
                             Integer | Key_Word | Operator =>
                            State := Found;
                            return;
                        when Identifier =>
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;  
                            State := Found;

                            return;
                        when others =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            return;
                    end case;


                when '"' =>
                    case State is
                        when Normal =>
                            State := Tiny_Str;
                            Lex_Token := Tiny_String;  
                        when Tiny_Str =>  
                            return;
                        when others =>
                            Fichier_Io.Unget (Fichier_Source);
                            if In_Reserved_Word (Lex_Value) then
                                Spell_Reserved_Word (Lex_Value);
                                Lex_Token := Token'Value (Bounded_String.Image
                                                             (Lex_Value));
                                State := Found;
                                return;
                            end if;

                            return;
                    end case;

                when Ascii.Eot =>
                    Lex_Token := L_End;
                    return;
                when others =>  
                    case State is
                        when Tiny_Str =>
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                        when others =>
                            State := Unknown;
                            Lex_Token := Unknown;
                            Bounded_String.Append
                               (Lex_Value, Current_Character);
                    end case;
            end case;
        end loop;
        -- Lex_Token := L_End;
    exception
        when Io.End_Error =>
            Lex_Token := L_End;
            return;
    end Next_Token;
end Lex;

E3 Meta Data

    nblk1=15
    nid=0
    hdr6=2a
        [0x00] rec0=26 rec1=00 rec2=01 rec3=028
        [0x01] rec0=12 rec1=00 rec2=15 rec3=032
        [0x02] rec0=24 rec1=00 rec2=14 rec3=008
        [0x03] rec0=06 rec1=00 rec2=08 rec3=01e
        [0x04] rec0=14 rec1=00 rec2=0d rec3=01a
        [0x05] rec0=16 rec1=00 rec2=07 rec3=050
        [0x06] rec0=18 rec1=00 rec2=0b rec3=010
        [0x07] rec0=17 rec1=00 rec2=0a rec3=040
        [0x08] rec0=12 rec1=00 rec2=0e rec3=036
        [0x09] rec0=17 rec1=00 rec2=0f rec3=020
        [0x0a] rec0=17 rec1=00 rec2=03 rec3=05a
        [0x0b] rec0=13 rec1=00 rec2=09 rec3=04a
        [0x0c] rec0=17 rec1=00 rec2=12 rec3=054
        [0x0d] rec0=12 rec1=00 rec2=06 rec3=034
        [0x0e] rec0=17 rec1=00 rec2=04 rec3=068
        [0x0f] rec0=15 rec1=00 rec2=13 rec3=02e
        [0x10] rec0=1b rec1=00 rec2=11 rec3=006
        [0x11] rec0=00 rec1=00 rec2=05 rec3=006
        [0x12] rec0=18 rec1=00 rec2=0c rec3=014
        [0x13] rec0=17 rec1=00 rec2=02 rec3=010
        [0x14] rec0=10 rec1=00 rec2=10 rec3=000
    tail 0x2153091f284e2854e2345 0x42a00088462060003