DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 8573 (0x217d) Types: TextFile Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧
with My_String; with Text_Io; with Token; package body Lex is The_File : Text_Io.File_Type; Current_Token : Token.Object; Lookahead : Boolean := False; Current_Value : My_String.Object (1000); Current_Char : Character; procedure Lex_Adress_Error is begin Text_Io.Put_Line ("Erreur de semantique : Adresse incorrecte"); end Lex_Adress_Error; procedure Open (Nom : String) is M : Text_Io.File_Mode := Text_Io.In_File; begin Text_Io.Open (File => The_File, Mode => M, Name => Nom, Form => ""); end Open; procedure Close is begin Text_Io.Close (The_File); end Close; function Get_Char return Character is begin if Lookahead then Lookahead := False; else if Text_Io.End_Of_Line (The_File) then Text_Io.Skip_Line (The_File); Current_Char := Ascii.Cr; else Text_Io.Get (The_File, Current_Char); end if; end if; return Current_Char; end Get_Char; procedure Unget_Char is begin Lookahead := True; end Unget_Char; procedure Next is type State is (St_Normal, St_Affect, St_Com_St, St_Less, St_Great, St_Word, St_Number, St_Adresse, St_Found); Current_State : State; The_Char : Character; begin if not Text_Io.End_Of_File (The_File) then My_String.Flush (Current_Value); Current_State := St_Normal; while Current_State /= St_Found loop if not Text_Io.End_Of_File (The_File) then The_Char := Get_Char; else The_Char := Ascii.Eot; end if; case Current_State is when St_Normal => case The_Char is when ' ' | Ascii.Cr | Ascii.Ht => null; when Ascii.Eot => Current_State := St_Found; Current_Token := Token.L_Eof; when '<' => Current_State := St_Less; when '>' => Current_State := St_Great; when '=' => Current_State := St_Affect; when ':' => Current_State := St_Found; Current_Token := Token.L_2points; when ',' => Current_State := St_Found; Current_Token := Token.L_Virgule; when '(' => Current_State := St_Found; Current_Token := Token.L_Ouvrante; when ')' => Current_State := St_Found; Current_Token := Token.L_Fermante; when '.' => Current_State := St_Found; Current_Token := Token.L_Point; when '+' => Current_State := St_Found; Current_Token := Token.L_Plus; when '-' => Current_State := St_Found; Current_Token := Token.L_Moins; when '*' => Current_State := St_Found; Current_Token := Token.L_Mult; when '/' => Current_State := St_Found; Current_Token := Token.L_Div; when '{' => Current_State := St_Com_St; when '#' => Current_State := St_Adresse; when others => if The_Char in 'a' .. 'z' or The_Char in 'A' .. 'Z' then My_String.Add (Current_Value, The_Char); Current_State := St_Word; else if The_Char in '0' .. '9' then My_String.Add (Current_Value, The_Char); Current_State := St_Number; else Current_Token := Token.L_Unk; Current_State := St_Found; end if; end if; end case; when St_Com_St => if The_Char = '}' then Current_State := St_Normal; end if; when St_Less => case The_Char is when '=' => Current_Token := Token.L_Inf_Ou_Egal; Current_State := St_Found; when '>' => Current_Token := Token.L_Pas_Egal; Current_State := St_Found; when others => Unget_Char; Current_Token := Token.L_Inf; Current_State := St_Found; end case; when St_Great => if The_Char = '=' then Current_Token := Token.L_Sup_Ou_Egal; else Unget_Char; Current_Token := Token.L_Sup; end if; Current_State := St_Found; when St_Word => if The_Char in 'a' .. 'z' or The_Char in 'A' .. 'Z' or The_Char in '0' .. '9' or The_Char = '_' then My_String.Add (Current_Value, The_Char); else Unget_Char; Current_Token := Token.Value (My_String.Value (Current_Value)); Current_State := St_Found; end if; when St_Number => if The_Char in '0' .. '9' then My_String.Add (Current_Value, The_Char); else Unget_Char; Current_Token := Token.L_Nbr; Current_State := St_Found; end if; when St_Affect => if The_Char = '=' then Current_State := St_Found; Current_Token := Token.L_Egal; else Unget_Char; Current_Token := Token.L_Affect; Current_State := St_Found; end if; when St_Adresse => case The_Char is when 'a' .. 'f' | 'A' .. 'F' | '0' .. '9' => My_String.Add (Current_Value, The_Char); when '#' => Current_Token := Token.L_Adresse; Current_State := St_Found; when others => Lex_Adress_Error; end case; when others => null; end case; end loop; else Current_Token := Token.L_Eof; end if; end Next; function Get_Token return Token.Object is begin return Current_Token; end Get_Token; function Get_Value return String is begin return My_String.Value (Current_Value); end Get_Value; function At_End return Boolean is begin return Text_Io.End_Of_File (The_File); end At_End; end Lex;