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

⟦96b397471⟧ Ada Source

    Length: 17408 (0x4400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lexical_Analyzer, seg_047551

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 Unbounded_String, String_Utilities;


package body Lexical_Analyzer is

    package Infinite_String is new Unbounded_String (80);


    Current_Value : Infinite_String.Variable_String;
    Current_Token : Tokens;

    Current_Position_In_Line : Natural := 0;
    Current_Line_In_File : Natural := 0;


    procedure Open (File_Name : String) is
    begin  
        Compiler_File.Open (File_Name);
    exception
        when Compiler_File.File_Does_Not_Exist =>
            raise File_Does_Not_Exist;
        when Compiler_File.A_File_Is_Already_Opened =>
            raise A_File_Is_Already_Opened;
    end Open;


    procedure Close is
    begin
        Compiler_File.Close;
    exception
        when Compiler_File.File_Has_Never_Been_Opened =>
            raise File_Has_Never_Been_Opened;
    end Close;


    function Is_Alpha (The_Character : Character) return Boolean is
    begin
        return ((The_Character in 'a' .. 'z') or
                (The_Character in 'A' .. 'Z') or (The_Character = '_'));
    end Is_Alpha;


    function Is_Digit (The_Character : Character) return Boolean is
    begin
        return (The_Character in '0' .. '9');
    end Is_Digit;

    procedure Next is
        type States is (State_Start, State_Comment, State_Less_Than,
                        State_More_Than, State_Identifier,
                        State_Waiting_End_Of_String, State_Integer,
                        State_Opening_Complement_Or_Verbe,
                        State_Waiting_End_Of_Complement_Or_Verbe, State_Found);


        Next_State, Current_State : States;
        Readed_Character : Character;
    begin
        Current_State := State_Start;
        Next_State := Current_State;
        Current_Token := Unknown;
        Infinite_String.Free (Current_Value);

        while (Current_State /= State_Found) loop
            Compiler_File.Next;
            Readed_Character := Compiler_File.Get_Value;
            case Current_State is

                when State_Start =>
                    Current_Line_In_File := Compiler_File.Get_Line_In_File;
                    Current_Position_In_Line :=
                       Compiler_File.Get_Position_In_Line;

                    case Readed_Character is  
                        when ' ' =>
                            Next_State := State_Start;
                        when '!' =>
                            Next_State := State_Comment;
                        when '<' =>
                            Next_State := State_Less_Than;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Current_Token := Less;
                        when '=' =>
                            Current_Token := Equal;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '>' =>
                            Next_State := State_More_Than;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Current_Token := More;
                        when '-' =>
                            Current_Token := Minus;  
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '+' =>
                            Current_Token := Plus;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '*' =>
                            Current_Token := Multiplication;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '/' =>
                            Current_Token := Division;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '.' =>
                            Current_Token := Terminator;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when 'a' .. 'z' | 'A' .. 'Z' | '_' =>
                            Current_Token := Identifier;
                            String_Utilities.Lower_Case (Readed_Character);
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Identifier;
                        when '"' =>
                            Next_State := State_Waiting_End_Of_String;
                        when ''' =>
                            Next_State := State_Opening_Complement_Or_Verbe;
                        when '0' .. '9' =>
                            Current_Token := Integer_Number;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Integer;
                        when ')' =>
                            Current_Token := Right_Bracket;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '(' =>
                            Current_Token := Left_Bracket;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when ']' =>
                            Current_Token := Right_Hook;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                        when '[' =>
                            Current_Token := Left_Hook;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;

                        when others =>
                            Current_Token := Unknown;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                            Next_State := State_Found;
                    end case;  
                when State_Comment =>
                    Next_State := State_Comment;
                when State_Less_Than =>
                    case Readed_Character is
                        when '=' =>
                            Current_Token := Less_Equal;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                        when '>' =>
                            Current_Token := Different;
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                        when others =>
                            Compiler_File.Unget;
                    end case;
                    Next_State := State_Found;
                when State_More_Than =>
                    if (Readed_Character = '=') then
                        Current_Token := More_Equal;
                        Infinite_String.Append
                           (Current_Value, Readed_Character);
                    else
                        Compiler_File.Unget;
                    end if;
                    Next_State := State_Found;  
                when State_Identifier =>
                    if not (Is_Alpha (Readed_Character) or
                            Is_Digit (Readed_Character)) then
                        Compiler_File.Unget;
                        Next_State := State_Found;
                    else  
                        String_Utilities.Lower_Case (Readed_Character);
                        Infinite_String.Append
                           (Current_Value, Readed_Character);
                    end if;
                when State_Waiting_End_Of_String =>
                    if (Readed_Character = '"') then
                        Current_Token := String_Of_Characters;
                        Next_State := State_Found;
                    else
                        Infinite_String.Append
                           (Current_Value, Readed_Character);
                    end if;
                when State_Opening_Complement_Or_Verbe =>
                    if (Is_Alpha (Readed_Character)) then
                        String_Utilities.Lower_Case (Readed_Character);
                        Infinite_String.Append
                           (Current_Value, Readed_Character);
                        Next_State := State_Waiting_End_Of_Complement_Or_Verbe;
                    else
                        Compiler_File.Unget;
                        Next_State := State_Found;
                    end if;
                when State_Waiting_End_Of_Complement_Or_Verbe =>
                    if (Readed_Character = ''') then
                        Current_Token := Complement_Or_Verbe;
                        Next_State := State_Found;
                    else
                        if (Is_Alpha (Readed_Character)) then  
                            String_Utilities.Lower_Case (Readed_Character);
                            Infinite_String.Append
                               (Current_Value, Readed_Character);
                        else
                            Compiler_File.Unget;
                            Next_State := State_Found;
                        end if;
                    end if;
                when State_Integer =>
                    if (Is_Digit (Readed_Character)) then
                        Infinite_String.Append
                           (Current_Value, Readed_Character);
                    else
                        Compiler_File.Unget;
                        Next_State := State_Found;
                    end if;


                when others =>  
                    Current_Token := Unknown;
                    Infinite_String.Append (Current_Value, Readed_Character);
                    Next_State := State_Found;

            end case;

            Current_State := Next_State;

            if ((Compiler_File.End_Of_Line = True) and then
                (Current_State /= State_Start)) then
                if (Current_State = State_Comment) then
                    Current_State := State_Start;
                else
                    Current_State := State_Found;
                end if;
            end if;

        end loop;

    exception
        when Compiler_File.End_Of_File =>
            raise Excep_Eof;
        when Compiler_File.File_Has_Never_Been_Opened =>
            raise File_Has_Never_Been_Opened;
    end Next;


    function String_To_Keyword (The_String : String) return Tokens is
    begin
        return Tokens'Value (The_String);
    exception
        when Constraint_Error =>
            return Unknown;
    end String_To_Keyword;


    function Get_Token return Tokens is
        Tempo : Tokens;
    begin
        if (Current_Token = Identifier) then
            Tempo := String_To_Keyword (Get_Value);
            if (Tempo /= Unknown) then
                Current_Token := Tempo;
            end if;
        end if;
        return Current_Token;
    end Get_Token;


    function Get_Value return String is
    begin
        return Infinite_String.Image (Current_Value);
    end Get_Value;


    function Get_Position_In_Line return Natural is
    begin
        return Current_Position_In_Line;
    end Get_Position_In_Line;


    function Get_Line_In_File return Natural is
    begin
        return Current_Line_In_File;
    end Get_Line_In_File;


end Lexical_Analyzer;


E3 Meta Data

    nblk1=10
    nid=4
    hdr6=1c
        [0x00] rec0=27 rec1=00 rec2=01 rec3=052
        [0x01] rec0=1c rec1=00 rec2=06 rec3=038
        [0x02] rec0=0e rec1=00 rec2=08 rec3=018
        [0x03] rec0=12 rec1=00 rec2=0e rec3=048
        [0x04] rec0=13 rec1=00 rec2=02 rec3=032
        [0x05] rec0=11 rec1=00 rec2=0b rec3=022
        [0x06] rec0=12 rec1=00 rec2=0f rec3=06e
        [0x07] rec0=0e rec1=00 rec2=0d rec3=036
        [0x08] rec0=15 rec1=00 rec2=10 rec3=016
        [0x09] rec0=13 rec1=00 rec2=0a rec3=050
        [0x0a] rec0=13 rec1=00 rec2=05 rec3=024
        [0x0b] rec0=1a rec1=00 rec2=07 rec3=028
        [0x0c] rec0=27 rec1=00 rec2=03 rec3=014
        [0x0d] rec0=12 rec1=00 rec2=09 rec3=000
        [0x0e] rec0=09 rec1=00 rec2=09 rec3=001
        [0x0f] rec0=00 rec1=00 rec2=00 rec3=000
    tail 0x215445ab286539adc8ae4 0x42a00088462060003
Free Block Chain:
  0x4: 0000  00 0c 00 ee 80 1c 20 20 20 20 20 20 20 20 20 20  ┆                ┆
  0xc: 0000  00 00 00 b7 00 1b 20 20 20 20 20 20 20 20 20 20  ┆                ┆