|
|
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 - metrics - downloadIndex: A B T
Length: 9623 (0x2597)
Types: TextFile
Names: »AUTOM«, »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦this⟧
with String_Utilities;
with Look_Ahead;
separate (Lexical)
package body Simulated_Automate is
type State is (St_Start, St_Let, St_Minus, St_Comm, St_Great,
St_Less, St_Hexa, St_Nbr, St_Word, St_Found);
subtype Low_Alpha is Character range 'a' .. 'z';
subtype Upp_Alpha is Character range 'A' .. 'Z';
-- subtype Low_Alpha_Hexa is Character range 'a' .. 'f';
-- subtype Upp_Alpha_Hexa is Character range 'A' .. 'F';
subtype Digit is Character range '0' .. '9';
The_Look_Ahead : Look_Ahead.Object;
package Keywords is
function Is_Keyword (The_Lexeme : Lexeme) return Boolean;
function Lexeme_To_Token (From : Lexeme) return Token;
end Keywords;
package body Keywords is separate;
procedure File_Next_Char (C : in out Character) is
begin
if Look_Ahead.Is_Existing (The_Look_Ahead) then
Look_Ahead.Value (The_Look_Ahead, C);
else
if At_End then
C := Ascii.Eot;
else
if Text_Io.End_Of_Line (The_File) then
Text_Io.Skip_Line (The_File);
C := Ascii.Lf;
else
Text_Io.Get (The_File, C);
end if;
end if;
end if;
end File_Next_Char;
procedure Next is
Current_State : State;
Current_Char : Character;
Number : Integer;
Conversion_Ok : Boolean;
begin
if not At_End then
Bounded_String.Free (Current_Value);
Current_State := St_Start;
loop
File_Next_Char (Current_Char);
case Current_State is
when St_Start =>
case Current_Char is
when Ascii.Eot =>
Current_Token := L_Eof;
Current_State := St_Found;
when ' ' | Ascii.Lf | Ascii.Ht =>
null;
when '(' =>
Current_Token := L_Open;
Current_State := St_Found;
when ')' =>
Current_Token := L_Close;
Current_State := St_Found;
when ',' =>
Current_Token := L_Comma;
Current_State := St_Found;
when '.' =>
Current_Token := L_Point;
Current_State := St_Found;
when ':' =>
Current_State := St_Let;
when '+' =>
Current_Token := L_Plus;
Current_State := St_Found;
when '-' =>
Current_State := St_Minus;
when '*' =>
Current_Token := L_Star;
Current_State := St_Found;
when '/' =>
Current_Token := L_Slash;
Current_State := St_Found;
when '=' =>
Current_Token := L_Equ;
Current_State := St_Found;
when '>' =>
Current_State := St_Great;
when '<' =>
Current_State := St_Less;
when '#' =>
Current_State := St_Hexa;
when Digit =>
Bounded_String.Append
(Current_Value, Current_Char);
Current_State := St_Nbr;
when Low_Alpha | Upp_Alpha | '_' =>
Bounded_String.Append
(Current_Value, Current_Char);
Current_State := St_Word;
when others =>
Current_Token := L_Unk;
Current_State := St_Found;
end case;
when St_Let =>
if Current_Char = '=' then
Current_Token := L_Affect;
Current_State := St_Found;
else
Current_Token := L_Unk;
Current_State := St_Found;
end if;
when St_Minus =>
if Current_Char = '-' then
Current_State := St_Comm;
else
Look_Ahead.Affect (The_Look_Ahead, Current_Char);
Current_Token := L_Minus;
Current_State := St_Found;
end if;
when St_Comm =>
if Current_Char = Ascii.Lf then
Current_State := St_Start;
end if;
when St_Great =>
if Current_Char = '=' then
Current_Token := L_Geq;
Current_State := St_Found;
else
Look_Ahead.Affect (The_Look_Ahead, Current_Char);
Current_Token := L_Gt;
Current_State := St_Found;
end if;
when St_Less =>
case Current_Char is
when '=' =>
Current_Token := L_Leq;
Current_State := St_Found;
when '>' =>
Current_Token := L_Neq;
Current_State := St_Found;
when others =>
Look_Ahead.Affect
(The_Look_Ahead, Current_Char);
Current_Token := L_Lt;
Current_State := St_Found;
end case;
when St_Hexa =>
case Current_Char is
when Digit | Low_Alpha | Upp_Alpha =>
Bounded_String.Append
(Current_Value, Current_Char);
when others =>
Look_Ahead.Affect
(The_Look_Ahead, Current_Char);
begin
String_Utilities.String_To_Number
(Bounded_String.Image (Current_Value),
Number, Conversion_Ok, 16);
if Conversion_Ok then
Bounded_String.Free (Current_Value);
Bounded_String.Append
(Current_Value,
String_Utilities.Number_To_String
(Number));
Current_Token := L_Nbr;
Current_State := St_Found;
else
Current_Token := L_Unk;
Current_State := St_Found;
end if;
exception
when Numeric_Error =>
Current_Token := L_Unk;
Current_State := St_Found;
end;
end case;
when St_Nbr =>
if Current_Char in Digit then
Bounded_String.Append (Current_Value, Current_Char);
else
Look_Ahead.Affect (The_Look_Ahead, Current_Char);
Current_Token := L_Nbr;
Current_State := St_Found;
end if;
when St_Word =>
case Current_Char is
when Low_Alpha | Upp_Alpha | '_' | Digit =>
Bounded_String.Append
(Current_Value, Current_Char);
when others =>
Look_Ahead.Affect
(The_Look_Ahead, Current_Char);
Current_Token :=
Keywords.Lexeme_To_Token (Lexical.Value);
Current_State := St_Found;
end case;
when St_Found =>
null;
end case;
exit when Current_State = St_Found;
end loop;
else
Current_Token := L_Eof;
end if;
end Next;
end Simulated_Automate;