|
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: 8192 (0x2000) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lex_Player, seg_047c4a
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
with Text_Io, Bounded_String; package body Lex_Player is type State is (St_Normal, St_Id, St_2point, St_Command, St_Found); subtype Minuscule is Character range 'a' .. 'z'; subtype Majuscule is Character range 'A' .. 'Z'; subtype Digit is Character range '0' .. '9'; The_Case_Offset : constant := Character'Pos ('a') - Character'Pos ('A'); The_String : String (1 .. Max_Player_String); The_Length : Natural; The_Index : Natural; Current_Value : Bounded_String.Variable_String (Max_Player_String); Current_Token : Token; Lookahead : Boolean; procedure Make_Uppercase (The_Character : in out Character) is begin -- Make_Uppercase The_Character := Character'Val (Character'Pos (The_Character) - The_Case_Offset); end Make_Uppercase; procedure Get_Player (Invite : in String := "") is Longueur : Natural; begin Text_Io.Put_Line (Invite); The_String := (others => ' '); Text_Io.Get_Line (The_String, The_Length); end Get_Player; procedure Init is begin The_Index := The_String'First - 1; Lookahead := False; Bounded_String.Free (Current_Value); end Init; function At_End return Boolean is begin return (The_Index >= The_Length); end At_End; function Get_Value return String is begin return (Bounded_String.Image (Current_Value)); end Get_Value; function Get_Token return Token is begin return (Current_Token); end Get_Token; procedure Get_State_After_2point (Astate : in out State; Achar : in Character) is Upchar : Character; begin if (Achar in Minuscule or Achar in Majuscule) then Upchar := Achar; if Upchar in Minuscule then Make_Uppercase (Upchar); end if; Bounded_String.Append (Current_Value, Upchar); Astate := St_Command; else Bounded_String.Append (Current_Value, Achar); Current_Token := Unk; Astate := St_Found; end if; end Get_State_After_2point; procedure Get_Command (Astate : in out State; Achar : in Character) is Upchar : Character; begin if (Achar in Minuscule or Achar in Majuscule) then Upchar := Achar; if Upchar in Minuscule then Make_Uppercase (Upchar); end if; Bounded_String.Append (Current_Value, Upchar); else Lookahead := True; Astate := St_Found; Current_Token := Command; end if; end Get_Command; procedure Get_Id (Astate : in out State; Achar : in Character) is Upchar : Character; begin if (Achar in Minuscule or Achar in Majuscule or Achar in Digit or Achar = '_') then Upchar := Achar; if Upchar in Minuscule then Make_Uppercase (Upchar); end if; Bounded_String.Append (Current_Value, Upchar); else Lookahead := True; Astate := St_Found; Current_Token := Id; end if; end Get_Id; procedure Get_State_After_Normal (Astate : in out State; Achar : in Character) is Upchar : Character; begin Upchar := Achar; case Achar is when Ascii.Cr | Ascii.Ht | ' ' => Astate := St_Normal; when Majuscule | Minuscule => if Upchar in Minuscule then Make_Uppercase (Upchar); end if; Bounded_String.Append (Current_Value, Upchar); Astate := St_Id; when ':' => Astate := St_2point; when others => Bounded_String.Append (Current_Value, Achar); Current_Token := Unk; Astate := St_Found; end case; end Get_State_After_Normal; procedure Next is Current_State : State; Current_Char : Character; begin if not (At_End) then Bounded_String.Free (Current_Value); Current_State := St_Normal; Search_Token: loop if not (Lookahead) then The_Index := The_Index + 1; if (The_Index > Max_Player_String) then Current_Token := Toolong; exit Search_Token; end if; else Lookahead := False; end if; Current_Char := The_String (The_Index); case Current_State is when St_Normal => Get_State_After_Normal (Current_State, Current_Char); when St_2point => Get_State_After_2point (Current_State, Current_Char); when St_Command => Get_Command (Current_State, Current_Char); when St_Id => Get_Id (Current_State, Current_Char); when others => Current_Token := Unk; Bounded_String.Append (Current_Value, Current_Char); Current_State := St_Found; end case; exit when Current_State = St_Found; end loop Search_Token; else Current_Token := Lexend; end if; end Next; end Lex_Player;
nblk1=7 nid=0 hdr6=e [0x00] rec0=22 rec1=00 rec2=01 rec3=030 [0x01] rec0=27 rec1=00 rec2=07 rec3=00e [0x02] rec0=02 rec1=00 rec2=02 rec3=024 [0x03] rec0=21 rec1=00 rec2=03 rec3=028 [0x04] rec0=1e rec1=00 rec2=04 rec3=046 [0x05] rec0=1f rec1=00 rec2=05 rec3=052 [0x06] rec0=1b rec1=00 rec2=06 rec3=001 tail 0x21544d3ca865748d02b9b 0x42a00088462060003