|
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: 17408 (0x4400) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lexical_Analyzer, seg_04673c
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
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, Current_Line_In_File : Natural; procedure Open (File_Name : String) is begin Compiler_File.Open (File_Name); end Open; procedure Close is begin Compiler_File.Close; 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; 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;
nblk1=10 nid=6 hdr6=1c [0x00] rec0=2a rec1=00 rec2=01 rec3=088 [0x01] rec0=1b rec1=00 rec2=08 rec3=00e [0x02] rec0=05 rec1=00 rec2=04 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=050 [0x0d] rec0=0e 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 0x21543352486515a0ac744 0x42a00088462060003 Free Block Chain: 0x6: 0000 00 0c 03 fb 80 13 3d 20 53 74 61 74 65 5f 53 74 ┆ = State_St┆ 0xc: 0000 00 00 00 b7 00 1b 20 20 20 20 20 20 20 20 20 20 ┆ ┆