|
|
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: 18432 (0x4800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Scanner, seg_037d97, seg_038a90, seg_039412, seg_039563
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Errors;
with String_Utilities;
with Text_Io;
with Tiny_File;
with Trace;
package body Scanner is
type State is (St_Normal, St_Minus, St_Comm, St_Str, St_Int,
St_Id, St_Id_More, St_Less, St_Great, St_Found);
Current_Lexeme : Lexeme;
Current_State : State;
Current_Token : Token;
Current_Line : Natural;
Error_Number : Natural;
Current_String_Length : Natural;
Current_Id_Length : Natural;
File_Input : Text_Io.File_Type;
procedure Start (File_Name : String) is
begin
Tiny_File.Open (File_Input, File_Name);
Current_Line := 1;
end Start;
function Get_Token return Token is
begin
return Current_Token;
end Get_Token;
function Get_Value return Lexeme is
begin
return Current_Lexeme;
end Get_Value;
function Get_Line_Number return Natural is
begin
return Current_Line;
end Get_Line_Number;
function Get_Error_Number return Natural is
begin
return Error_Number;
end Get_Error_Number;
procedure Check_For_Int_Error is
Current_Number : Integer;
Ok : Boolean;
begin
String_Utilities.String_To_Number
(Bounded_String.Image (Current_Lexeme), Current_Number, Ok);
if not Ok then
Current_Token := L_Unk;
Error_Number := 5;
end if;
end Check_For_Int_Error;
function Check_If_Reserved (Id : String) return Token is
begin
if Custom.Is_Reserved_Word (Id) then
case Custom.Reserved_Word'Value (Id) is
when Custom.Avec =>
return L_Avec;
when Custom.Pour =>
return L_Pour;
when Custom.Prendre =>
return L_Pren;
when Custom.Renvoyer =>
return L_Renv;
end case;
else
return L_Id;
end if;
end Check_If_Reserved;
procedure Normal_State (Current_Char : in out Character) is
begin
case Current_Char is
when Ascii.Eot =>
Current_Token := L_Eof;
Current_State := St_Found;
when ' ' | Ascii.Cr =>
null;
when '-' =>
Current_State := St_Minus;
Bounded_String.Append (Current_Lexeme, Current_Char);
when '"' =>
Current_State := St_Str;
Current_String_Length := 0;
when '0' .. '9' =>
Current_State := St_Int;
Bounded_String.Append (Current_Lexeme, Current_Char);
when 'a' .. 'z' | 'A' .. 'Z' =>
Current_State := St_Id;
String_Utilities.Upper_Case (Current_Char);
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Id_Length := 1;
when '{' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Obra;
when '}' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Cbra;
when '.' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Dot;
when '(' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Opar;
when ')' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Cpar;
when '+' | '*' | '/' | '^' | '=' | '&' | '|' | '%' =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Binm;
when '<' =>
Current_State := St_Less;
Bounded_String.Append (Current_Lexeme, Current_Char);
when '>' =>
Current_State := St_Great;
Bounded_String.Append (Current_Lexeme, Current_Char);
when others =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Unk;
Error_Number := 1;
end case;
end Normal_State;
procedure Minus_State (Current_Char : Character) is
begin
case Current_Char is
when '-' =>
Current_State := St_Comm;
when others =>
Tiny_File.Unget (File_Input);
Current_State := St_Found;
Current_Token := L_Binm;
end case;
end Minus_State;
procedure Comm_State (Current_Char : Character) is
begin
case Current_Char is
when Ascii.Cr =>
Current_State := St_Normal;
Bounded_String.Free (Current_Lexeme);
when others =>
null;
end case;
end Comm_State;
procedure Str_State (Current_Char : Character) is
begin
case Current_Char is
when '"' =>
Current_State := St_Found;
Current_Token := L_Str;
when Ascii.Cr =>
null;
when others =>
Current_String_Length := Current_String_Length + 1;
if Current_String_Length > Custom.String_Max_Length then
Current_State := St_Found;
Current_Token := L_Unk;
Error_Number := 3;
else
Bounded_String.Append (Current_Lexeme, Current_Char);
end if;
end case;
end Str_State;
procedure Int_State (Current_Char : Character) is
begin
case Current_Char is
when '0' .. '9' =>
Bounded_String.Append (Current_Lexeme, Current_Char);
when others =>
Tiny_File.Unget (File_Input);
Current_State := St_Found;
Current_Token := L_Int;
Check_For_Int_Error;
end case;
end Int_State;
procedure Id_State (Current_Char : in out Character) is
begin
case Current_Char is
when '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' =>
Current_Id_Length := Current_Id_Length + 1;
if Current_Id_Length > Custom.Id_Max_Length then
Current_State := St_Found;
Current_Token := L_Unk;
Error_Number := 4;
else
String_Utilities.Upper_Case (Current_Char);
Bounded_String.Append (Current_Lexeme, Current_Char);
end if;
when '_' =>
Current_Id_Length := Current_Id_Length + 1;
if Current_Id_Length > Custom.Id_Max_Length then
Current_State := St_Found;
Current_Token := L_Unk;
Error_Number := 4;
else
Current_State := St_Id_More;
Bounded_String.Append (Current_Lexeme, Current_Char);
end if;
when ':' =>
Current_Id_Length := Current_Id_Length + 1;
if Current_Id_Length > Custom.Id_Max_Length then
Current_State := St_Found;
Current_Token := L_Unk;
Error_Number := 4;
else
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_State := St_Found;
Current_Token := L_Keyw;
end if;
when others =>
Tiny_File.Unget (File_Input);
Current_State := St_Found;
Current_Token := Check_If_Reserved
(Bounded_String.Image (Current_Lexeme));
end case;
end Id_State;
procedure Id_More_State (Current_Char : in out Character) is
begin
case Current_Char is
when '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' =>
Current_Id_Length := Current_Id_Length + 1;
if Current_Id_Length > Custom.Id_Max_Length then
Current_State := St_Found;
Current_Token := L_Unk;
Error_Number := 4;
else
Current_State := St_Id;
String_Utilities.Upper_Case (Current_Char);
Bounded_String.Append (Current_Lexeme, Current_Char);
end if;
when others =>
Current_State := St_Found;
Bounded_String.Append (Current_Lexeme, Current_Char);
Current_Token := L_Unk;
Error_Number := 2;
end case;
end Id_More_State;
procedure Less_State (Current_Char : Character) is
begin
case Current_Char is
when '>' | '=' =>
Current_State := St_Found;
Current_Token := L_Binm;
Bounded_String.Append (Current_Lexeme, Current_Char);
when others =>
Tiny_File.Unget (File_Input);
Current_State := St_Found;
Current_Token := L_Binm;
end case;
end Less_State;
procedure Great_State (Current_Char : Character) is
begin
case Current_Char is
when '=' =>
Current_State := St_Found;
Current_Token := L_Binm;
Bounded_String.Append (Current_Lexeme, Current_Char);
when others =>
Tiny_File.Unget (File_Input);
Current_State := St_Found;
Current_Token := L_Binm;
end case;
end Great_State;
procedure Next_Token is
Current_Char : Character;
begin
Bounded_String.Free (Current_Lexeme);
Current_State := St_Normal;
Error_Number := 0;
loop
Current_Char := Tiny_File.Get (File_Input);
if Current_Char = Ascii.Cr then
Current_Line := Current_Line + 1;
end if;
case Current_State is
when St_Normal =>
Normal_State (Current_Char);
when St_Minus =>
Minus_State (Current_Char);
when St_Comm =>
Comm_State (Current_Char);
when St_Str =>
Str_State (Current_Char);
when St_Int =>
Int_State (Current_Char);
when St_Id =>
Id_State (Current_Char);
when St_Id_More =>
Id_More_State (Current_Char);
when St_Less =>
Less_State (Current_Char);
when St_Great =>
Great_State (Current_Char);
when St_Found =>
exit;
end case;
exit when Current_State = St_Found;
end loop;
case Current_Token is
when L_Unk =>
raise Errors.Unknown_Lexeme_Found;
when others =>
null;
end case;
Trace.Display (Current_Token);
Trace.Display (Current_Lexeme);
end Next_Token;
procedure Stop is
begin
Tiny_File.Close (File_Input);
end Stop;
end Scanner;
nblk1=11
nid=8
hdr6=1a
[0x00] rec0=2a rec1=00 rec2=01 rec3=024
[0x01] rec0=1f rec1=00 rec2=0a rec3=02a
[0x02] rec0=1b rec1=00 rec2=0b rec3=00c
[0x03] rec0=03 rec1=00 rec2=10 rec3=058
[0x04] rec0=15 rec1=00 rec2=0e rec3=020
[0x05] rec0=1b rec1=00 rec2=07 rec3=05c
[0x06] rec0=1d rec1=00 rec2=0c rec3=010
[0x07] rec0=1a rec1=00 rec2=02 rec3=03c
[0x08] rec0=15 rec1=00 rec2=04 rec3=04e
[0x09] rec0=18 rec1=00 rec2=0d rec3=01e
[0x0a] rec0=1c rec1=00 rec2=05 rec3=050
[0x0b] rec0=1c rec1=00 rec2=06 rec3=018
[0x0c] rec0=20 rec1=00 rec2=03 rec3=000
[0x0d] rec0=21 rec1=00 rec2=03 rec3=000
[0x0e] rec0=19 rec1=00 rec2=03 rec3=000
[0x0f] rec0=10 rec1=00 rec2=02 rec3=000
[0x10] rec0=00 rec1=00 rec2=00 rec3=000
tail 0x21531268084e5885989c7 0x42a00088462060003
Free Block Chain:
0x8: 0000 00 0f 00 06 80 03 65 5f 4e 03 5f 4e 06 20 47 65 ┆ e_N _N Ge┆
0xf: 0000 00 09 03 fc 80 06 20 63 61 73 65 3b 06 00 0c 20 ┆ case; ┆
0x9: 0000 00 11 03 fc 80 24 5f 53 74 61 74 65 20 28 43 75 ┆ $_State (Cu┆
0x11: 0000 00 00 00 04 00 01 20 01 02 03 04 00 00 01 57 3a ┆ W:┆