|
|
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 - metrics - download
Length: 17408 (0x4400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Lexical_Analyzer, seg_047496
└─⟦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 : Natural := 0;
Current_Line_In_File : Natural := 0;
procedure Open (File_Name : String) is
begin
Compiler_File.Open (File_Name);
exception
when Compiler_File.File_Does_Not_Exist =>
raise File_Does_Not_Exist;
when Compiler_File.A_File_Is_Already_Opened =>
raise File_Has_Never_Been_Opened;
end Open;
procedure Close is
begin
Compiler_File.Close;
exception
when Compiler_File.File_Has_Never_Been_Opened =>
raise File_Has_Never_Been_Opened;
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;
when Compiler_File.File_Has_Never_Been_Opened =>
raise File_Has_Never_Been_Opened;
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=4
hdr6=1c
[0x00] rec0=28 rec1=00 rec2=01 rec3=052
[0x01] rec0=1d rec1=00 rec2=06 rec3=032
[0x02] rec0=0e rec1=00 rec2=08 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=25 rec1=00 rec2=03 rec3=020
[0x0d] rec0=11 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 0x21544440a86538c0fc4e5 0x42a00088462060003
Free Block Chain:
0x4: 0000 00 0c 00 ee 80 1c 20 20 20 20 20 20 20 20 20 20 ┆ ┆
0xc: 0000 00 00 00 b7 00 1b 20 20 20 20 20 20 20 20 20 20 ┆ ┆