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

⟦19b2664c3⟧ Ada Source

    Length: 11264 (0x2c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lexical, seg_044a33

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 Bounded_String, Source, Text_Io;

use Bounded_String;

package body Lexical is

    type State is (St_Normal, St_Comment, St_Nbr, St_Debstr, St_Finstr,
                   St_Id, St_2point, St_Affect, St_Inf, St_Infequ,
                   St_Diffr, St_Sup, St_Supequ, St_Newlinestr, St_Found);
    subtype Minuscule is Character range 'a' .. 'z';
    subtype Majuscule is Character range 'A' .. 'Z';
    subtype Digit is Character range '0' .. '9';
    subtype Keyword is Token range Jeu .. Fin;



    Currentvalue : Variable_String (Maxstring);
    Currenttoken : Token;


    function Iskeyword (The_String : in String) return Boolean is
        T : Keyword;
    begin
        T := Keyword'Value (The_String);
        return True;
    exception
        when Constraint_Error =>
            return False;
    end Iskeyword;



    function Keywordtotoken (Word : in String) return Token is
    begin
        if Iskeyword (Word) then
            return Token'Value (Word);
        else
            return Id;
        end if;
    end Keywordtotoken;



    procedure Get_State_After_Inf
                 (Astate : in out State; Achar : in Character) is
    begin
        case Achar is
            when '=' =>
                Currenttoken := Infequ;
            when '>' =>
                Currenttoken := Diffr;
            when others =>
                Source.Unget;
                Currenttoken := Inf;
        end case;
        Astate := St_Found;
    end Get_State_After_Inf;


    procedure Get_State_After_Sup
                 (Astate : in out State; Achar : in Character) is
    begin
        if (Achar = '=') then
            Currenttoken := Supequ;
        else
            Currenttoken := Sup;
            Source.Unget;
        end if;
        Astate := St_Found;
    end Get_State_After_Sup;

    procedure Get_String_After_Debstr
                 (Astate : in out State; Achar : in Character) is
    begin
        if (Achar = '"') then
            Astate := St_Finstr;
        elsif (Achar = '\') then
            Astate := St_Newlinestr;
        elsif not (Achar = Ascii.Cr) then
            Bounded_String.Append (Currentvalue, Achar);
        end if;
    end Get_String_After_Debstr;


    procedure Get_String_After_Newlinestr
                 (Astate : in out State; Achar : in Character) is
    begin
        if (Achar = '\') then
            Astate := St_Debstr;
        elsif (Achar = ' ' or Achar = Ascii.Cr or Achar = Ascii.Ht) then
            Astate := St_Newlinestr;
        else
            Currenttoken := Unk;
            Astate := St_Found;
        end if;
    end Get_String_After_Newlinestr;


    procedure Get_String_After_Finstr
                 (Astate : in out State; Achar : in Character) is
    begin
        if (Achar = '"') then
            Bounded_String.Append (Currentvalue, Achar);
            Astate := St_Debstr;
        else
            Currenttoken := Str;
            Astate := St_Found;
            Source.Unget;
        end if;
    end Get_String_After_Finstr;

    procedure Get_State_After_2point
                 (Astate : in out State; Achar : in Character) is
    begin
        if (Achar = '=') then
            Currenttoken := Affect;
        else
            Currenttoken := Unk;
        end if;
        Astate := St_Found;
    end Get_State_After_2point;


    procedure Get_Id (Astate : in out State; Achar : in Character) is
    begin

        if (Achar in Minuscule or Achar in Majuscule or
            Achar in Digit or Achar = '_') then
            Bounded_String.Append (Currentvalue, Achar);
        else
            Source.Unget;
            Astate := St_Found;
            Currenttoken := Keywordtotoken
                               (Bounded_String.Image (Currentvalue));
        end if;
    end Get_Id;


    procedure Get_Nbr (Astate : in out State; Achar : in Character) is
    begin
        if (Achar in Digit) then
            Bounded_String.Append (Currentvalue, Achar);
        else
            Source.Unget;
            Astate := St_Found;
            Currenttoken := Nbr;
        end if;
    end Get_Nbr;


    procedure Get_State_After_Normal
                 (Astate : in out State; Achar : in Character) is
    begin
        case Achar is
            when Ascii.Cr | Ascii.Ht | ' ' =>
                Astate := St_Normal;
            when '*' =>
                Currenttoken := Mul;
                Astate := St_Found;
            when '/' =>
                Currenttoken := Div;
                Astate := St_Found;
            when '[' =>
                Currenttoken := Crocho;
                Astate := St_Found;
            when ']' =>
                Currenttoken := Crochf;
                Astate := St_Found;
            when '(' =>
                Currenttoken := Parnto;
                Astate := St_Found;
            when ')' =>
                Currenttoken := Parntf;
                Astate := St_Found;
            when ',' =>
                Currenttoken := Virgul;
                Astate := St_Found;
            when '+' =>
                Currenttoken := Plus;
                Astate := St_Found;
            when '-' =>
                Currenttoken := Moins;
                Astate := St_Found;
            when '.' =>
                Currenttoken := Point;
                Astate := St_Found;
            when '=' =>
                Currenttoken := Equ;
                Astate := St_Found;
            when '{' =>
                Astate := St_Comment;
            when '"' =>
                Astate := St_Debstr;
            when ':' =>
                Astate := St_2point;
            when '<' =>
                Astate := St_Inf;
            when '>' =>
                Astate := St_Sup;

            when Digit =>
                Bounded_String.Append (Currentvalue, Achar);
                Astate := St_Nbr;
            when Majuscule | Minuscule =>
                Bounded_String.Append (Currentvalue, Achar);
                Astate := St_Id;
            when others =>
                Bounded_String.Append (Currentvalue, Achar);
                Currenttoken := Unk;
                Astate := St_Found;
        end case;
    end Get_State_After_Normal;





    procedure Init (Nomf : String) is

    begin
        Source.Init (Nomf);
    end Init;

    function Get_Token return Token is
    begin
        return Currenttoken;
    end Get_Token;

    function Get_Value return String is
    begin
        return Bounded_String.Image (Currentvalue);
    end Get_Value;

    function At_End return Boolean is
    begin
        return Source.At_End;
    end At_End;

    function Get_Line return Natural is
    begin
        return Source.Get_Line;
    end Get_Line;

    function Get_Column return Natural is
    begin
        return Source.Get_Column;
    end Get_Column;


    procedure Next is

        Currentchar : Character;
        Currentstate : State;

    begin
        if not (Source.At_End) then
            Bounded_String.Free (Currentvalue);
            Currentstate := St_Normal;
            Search_Token:
                loop
                    if not (Source.At_End) then
                        Source.Next;
                        Currentchar := Source.Value;
                    else
                        Currenttoken := Lexend;
                        exit Search_Token;
                    end if;

                    case Currentstate is
                        when St_Normal =>
                            Get_State_After_Normal (Currentstate, Currentchar);
                        when St_Comment =>
                            if (Currentchar = '}') then
                                Currentstate := St_Normal;
                            end if;
                        when St_Debstr =>
                            Get_String_After_Debstr (Currentstate, Currentchar);
                        when St_Newlinestr =>
                            Get_String_After_Newlinestr
                               (Currentstate, Currentchar);
                        when St_Finstr =>
                            Get_String_After_Finstr (Currentstate, Currentchar);
                        when St_2point =>
                            Get_State_After_2point (Currentstate, Currentchar);
                        when St_Inf =>
                            Get_State_After_Inf (Currentstate, Currentchar);
                        when St_Sup =>
                            Get_State_After_Sup (Currentstate, Currentchar);
                        when St_Id =>
                            Get_Id (Currentstate, Currentchar);
                        when St_Nbr =>
                            Get_Nbr (Currentstate, Currentchar);
                        when others =>
                            Currenttoken := Unk;
                            Bounded_String.Append (Currentvalue, Currentchar);
                            Currentstate := St_Found;
                    end case;
                    exit when Currentstate = St_Found;

                end loop Search_Token;
        else
            Currenttoken := Lexend;
        end if;
    end Next;

    procedure Close is
    begin
        Source.Close;
    end Close;

end Lexical;


E3 Meta Data

    nblk1=a
    nid=0
    hdr6=14
        [0x00] rec0=25 rec1=00 rec2=01 rec3=00a
        [0x01] rec0=25 rec1=00 rec2=02 rec3=050
        [0x02] rec0=1f rec1=00 rec2=03 rec3=016
        [0x03] rec0=23 rec1=00 rec2=04 rec3=010
        [0x04] rec0=1f rec1=00 rec2=05 rec3=022
        [0x05] rec0=1f rec1=00 rec2=06 rec3=004
        [0x06] rec0=28 rec1=00 rec2=07 rec3=012
        [0x07] rec0=20 rec1=00 rec2=08 rec3=05e
        [0x08] rec0=12 rec1=00 rec2=09 rec3=01a
        [0x09] rec0=17 rec1=00 rec2=0a rec3=000
    tail 0x21745e1d286427e65d748 0x42a00088462060003