|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 14336 (0x3800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lex, seg_049bda, seg_049c12, seg_049c24
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧ └─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Text_Io, File, Moving_String, String_Utilities; use Moving_String; package body Lex is Current_Value : Moving_String.Object; Current_Token : Token; Current_Token_Line : Natural; Current_Token_Column : Natural; procedure Initialize is begin File.Initialize; Lex.Next; end Initialize; procedure Write_Error_File (Line : in String) is begin File.Write_Error_File (Line); end Write_Error_File; procedure Show_Error_File is begin File.Show_Error_File; end Show_Error_File; procedure Close is begin File.Close; end Close; function Get_Token return Token is begin return Current_Token; end Get_Token; function Get_Lower_Case_Value return String is begin return String_Utilities.Lower_Case (Moving_String.Image (Current_Value)); end Get_Lower_Case_Value; function Get_Lower_Case_Value return Moving_String.Object is begin return Moving_String.From_String (String_Utilities.Lower_Case (Moving_String.Image (Current_Value))); end Get_Lower_Case_Value; function Get_Value return String is begin return Moving_String.Image (Current_Value); end Get_Value; function Is_At_End return Boolean is begin return Current_Token = End_Of_Text; end Is_At_End; function Get_Line return Natural is begin return Current_Token_Line; end Get_Line; function Get_Column return Natural is begin return Current_Token_Column; end Get_Column; procedure Next is type State is (Normal, Divide, Less, Greater, Word, Sentence, Number, Found); subtype Upper_Letter is Character range 'A' .. 'Z'; subtype Lower_Letter is Character range 'a' .. 'z'; subtype Digit is Character range '0' .. '9'; Current_Character : Character; Current_State : State := Normal; function Word_To_Token (Word : in String) return Token is subtype Keyword_Token is Token range Entier .. Fin; Temporary_Word : String (Word'Range) := Word; Choosen_Token : Token := Id; begin String_Utilities.Upper_Case (Temporary_Word); for A_Token in Keyword_Token'First .. Keyword_Token'Last loop if Temporary_Word = Keyword_Token'Image (A_Token) then Choosen_Token := A_Token; end if; end loop; return Choosen_Token; end Word_To_Token; begin Moving_String.Free (Current_Value); Select_Token: loop File.Next; Current_Character := File.Get_Value; if (Current_State = Normal and Current_Character /= ' ' and Current_Character /= Ascii.Lf) then Current_Token_Line := File.Get_Line; Current_Token_Column := File.Get_Column; end if; case Current_State is when Normal => case Current_Character is when ' ' | Ascii.Lf => null; when ',' => Current_Token := Comma; Current_State := Found; when '=' => Current_Token := Equal; Current_State := Found; when '#' => Current_Token := Diese; Current_State := Found; when ':' => Current_Token := Colon; Current_State := Found; when '"' => Current_State := Sentence; when '/' => Current_State := Divide; when '*' => Current_Token := Multiply; Current_State := Found; when '-' => Current_Token := Substract; Current_State := Found; when '+' => Current_Token := Add; Current_State := Found; when '<' => Current_State := Less; when '>' => Current_State := Greater; when '&' => Current_Token := Ampersand; Current_State := Found; when '(' => Current_Token := Opening_Bracket; Current_State := Found; when ')' => Current_Token := Closing_Bracket; Current_State := Found; when others => if Current_Character in Upper_Letter or Current_Character in Lower_Letter then Current_Value := Current_Value & Current_Character; Current_State := Word; elsif Current_Character in Digit then Current_Value := Current_Value & Current_Character; Current_State := Number; elsif Current_Character = Ascii.Eot then Current_Token := End_Of_Text; Current_State := Found; else Current_Token := Unknown_Symbol; Current_State := Found; end if; end case; when Word => if Current_Character in Upper_Letter or Current_Character in Lower_Letter or Current_Character in Digit or Current_Character = '_' then Current_Value := Current_Value & Current_Character; else File.Unget; Current_Token := Word_To_Token (Moving_String.Image (Current_Value)); Current_State := Found; end if; when Divide => if Current_Character = '/' then while File.Get_Value /= Ascii.Lf loop File.Next; end loop; File.Unget; Current_State := Normal; else File.Unget; Current_Token := Divide; Current_State := Found; end if; when Less => if Current_Character = '=' then Current_Token := Less_Equal; elsif Current_Character = '>' then Current_Token := Not_Equal; else File.Unget; Current_Token := Less; end if; Current_State := Found; when Greater => if Current_Character = '=' then Current_Token := Greater_Equal; else File.Unget; Current_Token := Greater; end if; Current_State := Found; when Sentence => if Current_Character = '"' then Current_Token := Right_Sentence; Current_State := Found; elsif Current_Character = Ascii.Eot or Current_Character = Ascii.Lf then Current_Token := Wrong_Sentence; Current_State := Found; File.Unget; else Current_Value := Current_Value & Current_Character; end if; when Number => if Current_Character in Digit then Current_Value := Current_Value & Current_Character; else File.Unget; Current_Token := Number; Current_State := Found; end if; when Found => null; end case; exit when Current_State = Found; end loop Select_Token; end Next; end Lex;
nblk1=d nid=c hdr6=16 [0x00] rec0=2e rec1=00 rec2=01 rec3=000 [0x01] rec0=21 rec1=00 rec2=0b rec3=032 [0x02] rec0=1c rec1=00 rec2=0d rec3=024 [0x03] rec0=15 rec1=00 rec2=07 rec3=058 [0x04] rec0=03 rec1=00 rec2=02 rec3=058 [0x05] rec0=14 rec1=00 rec2=09 rec3=026 [0x06] rec0=10 rec1=00 rec2=04 rec3=042 [0x07] rec0=12 rec1=00 rec2=08 rec3=020 [0x08] rec0=14 rec1=00 rec2=03 rec3=00c [0x09] rec0=14 rec1=00 rec2=05 rec3=04e [0x0a] rec0=17 rec1=00 rec2=06 rec3=000 [0x0b] rec0=05 rec1=00 rec2=09 rec3=000 [0x0c] rec0=24 rec1=00 rec2=0f rec3=790 tail 0x2154736b686619806f7c4 0x42a00088462060003 Free Block Chain: 0xc: 0000 00 0a 03 fc 80 35 20 20 20 20 20 20 20 20 20 20 ┆ 5 ┆ 0xa: 0000 00 00 00 2d 80 12 20 20 20 20 20 20 20 46 69 6c ┆ - Fil┆