|
|
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: 40960 (0xa000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Abstract_Tree, seg_0464e9
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Lexical, Bounded_String, Text_Io, Simulateur_Tds,
Simulateur_Itr, Unchecked_Deallocation, Erreur;
with Models, Symbols;
use Lexical, Bounded_String;
package body Abstract_Tree is
procedure Free is new Unchecked_Deallocation (Cell, Object);
procedure Destroy (Node : in out Object) is
begin
case Node.Kind is
when Binary_Operator =>
Destroy (Node.Right_Node);
Destroy (Node.Left_Node);
Free (Node);
when Unary_Operator =>
Destroy (Node.Down_Node);
Free (Node);
when Integer_Data | Boolean_Data | State_Data |
Var_Data | Instruction | Player_Entry =>
Free (Node);
end case;
end Destroy;
function Make_Node
(Operation : Token; Left, Right : Object) return Object is
The_Cell : Cell;
New_Node : Object;
begin
New_Node := new Cell (Kind => Binary_Operator);
case Operation is
when Plus | Moins | Mul | Div =>
New_Node.all := (Return_Type => Integer_Type,
Kind => Binary_Operator,
Binary_Kind => Operation,
Left_Node => Left,
Right_Node => Right);
if What_Type (Left) /= Integer_Type or
What_Type (Right) /= Integer_Type then
Erreur.Alerte ("Op Arithmetique: TYPES INCOMPATIBLES (" &
Token'Image (Operation) & ")");
end if;
when Equ | Diffr =>
New_Node.all := (Return_Type => Boolean_Type,
Kind => Binary_Operator,
Binary_Kind => Operation,
Left_Node => Left,
Right_Node => Right);
if What_Type (Left) /= What_Type (Right) then
Erreur.Alerte ("Op Test: TYPES INCOMPATIBLES (" &
Token'Image (Operation) & ")");
end if;
when Inf | Infequ | Sup | Supequ =>
New_Node.all := (Return_Type => Boolean_Type,
Kind => Binary_Operator,
Binary_Kind => Operation,
Left_Node => Left,
Right_Node => Right);
if What_Type (Left) /= Integer_Type or
What_Type (Right) /= Integer_Type then
Erreur.Alerte ("Op Test: TYPES INCOMPATIBLES (" &
Token'Image (Operation) & ")");
end if;
when Et | Ou =>
New_Node.all := (Return_Type => Boolean_Type,
Kind => Binary_Operator,
Binary_Kind => Operation,
Left_Node => Left,
Right_Node => Right);
if (What_Type (Left) /= Boolean_Type and
What_Type (Left) /= Entry_Type) or
(What_Type (Right) /= Boolean_Type and
What_Type (Right) /= Entry_Type) then
Erreur.Alerte ("Op Binaire: TYPES INCOMPATIBLES (" &
Token'Image (Operation) & ")");
end if;
when others =>
null;
end case;
return New_Node;
end Make_Node;
function Make_Node (Operation : Token; Down : Object) return Object is
New_Node : Object;
begin
New_Node := new Cell (Kind => Unary_Operator);
case Operation is
when Non =>
New_Node.all := (Return_Type => Boolean_Type,
Kind => Unary_Operator,
Unary_Kind => Operation,
Down_Node => Down);
if What_Type (Down) /= Boolean_Type then
Erreur.Alerte ("Op Unaire: TYPES INCOMPATIBLES");
end if;
when others =>
null;
end case;
return New_Node;
end Make_Node;
function Make_Node (Value : Integer) return Object is
New_Node : Object;
begin
New_Node := new Cell (Kind => Integer_Data);
New_Node.all := (Return_Type => Integer_Type,
Kind => Integer_Data,
Integer_Value => Value);
return New_Node;
end Make_Node;
function Make_Node (Value : Token) return Object is
New_Node : Object;
begin
case Value is
when Lie | Delie =>
New_Node := new Cell (State_Data);
New_Node.all := (Return_Type => State_Type,
Kind => State_Data,
State_Value => Value);
when Vrai =>
New_Node := new Cell (Boolean_Data);
New_Node.all := (Return_Type => Boolean_Type,
Kind => Boolean_Data,
Boolean_Value => True);
when Faux =>
New_Node := new Cell (Boolean_Data);
New_Node.all := (Return_Type => Boolean_Type,
Kind => Boolean_Data,
Boolean_Value => False);
when others =>
null;
end case;
return New_Node;
end Make_Node;
function Make_Node (Name, Extension : String;
Models_Table : Models.Object;
Symbols_Table : Symbols.Object) return Object is
New_Node : Object;
The_Name, The_Extension : Variable_String (32);
begin
Bounded_String.Free (The_Name);
Bounded_String.Copy (The_Name, Name);
Bounded_String.Free (The_Extension);
Bounded_String.Copy (The_Extension, Extension);
if Bounded_String.Length (The_Extension) = 0 then
if Symbols.Get_Symbol_Type (Symbols_Table, Models_Table, Name) =
"ENUMERE" then
New_Node := new Cell (Kind => Integer_Data);
New_Node.all :=
(Return_Type => Enumeration_Type,
Kind => Integer_Data,
Integer_Value =>
Symbols.Get_Symbol_Value
(Symbols_Table, Models_Table, Name, Name));
else
if Symbols.Get_Symbol_Type (Symbols_Table, Models_Table, Name) =
"STRUCTURE" then
New_Node := new Cell (Var_Data);
New_Node.all := (Return_Type => Struct_Type,
Kind => Var_Data,
Var_Name => The_Name,
Var_Extension => The_Extension);
else
Erreur.Alerte ("Manque Extension !!!");
end if;
end if;
else
New_Node := new Cell (Var_Data);
New_Node.all := (Return_Type => Other_Type,
Kind => Var_Data,
Var_Name => The_Name,
Var_Extension => The_Extension);
if Symbols.Get_Symbol_Type
(Symbols_Table, Models_Table, Name, Extension) = "ENTIER" then
New_Node.Return_Type := Integer_Type;
else
if Symbols.Get_Symbol_Type
(Symbols_Table, Models_Table, Name, Extension) =
"BOOLEEN" then
New_Node.Return_Type := Boolean_Type;
else
if Symbols.Get_Symbol_Type
(Symbols_Table, Models_Table, Name, Extension) =
"ENUMERE" then
New_Node.Return_Type := Enumeration_Type;
else
Erreur.Alerte
("Uniquement des Entiers/Booleens/Enumeres dans les expressions!!!");
end if;
end if;
end if;
end if;
return New_Node;
end Make_Node;
function Make_Node (Name : Token; Param1, Param2 : String) return Object is
New_Node : Object;
The_Param1, The_Param2 : Variable_String (32);
begin
New_Node := new Cell (Kind => Instruction);
Bounded_String.Free (The_Param1);
Bounded_String.Copy (The_Param1, Param1);
Bounded_String.Free (The_Param2);
Bounded_String.Copy (The_Param2, Param2);
case Name is
when Existe_Connexion | Existe_Lien =>
New_Node.all := (Return_Type => Boolean_Type,
Kind => Instruction,
Instruction_Name => Name,
Param1 => The_Param1,
Param2 => The_Param2);
when Etat_Connexion | Etat_Lien =>
New_Node.all := (Return_Type => State_Type,
Kind => Instruction,
Instruction_Name => Name,
Param1 => The_Param1,
Param2 => The_Param2);
when Destination_Connexion =>
New_Node.all := (Return_Type => Struct_Type,
Kind => Instruction,
Instruction_Name => Name,
Param1 => The_Param1,
Param2 => The_Param2);
when others =>
null;
end case;
return New_Node;
end Make_Node;
function Make_Node (Entry1, Entry2, Entry3 : String) return Object is
New_Node : Object;
Entry_Count : Integer;
The_Entry1, The_Entry2, The_Entry3 : Variable_String (32);
begin
New_Node := new Cell (Kind => Player_Entry);
Bounded_String.Free (The_Entry1);
Bounded_String.Copy (The_Entry1, Entry1);
Bounded_String.Free (The_Entry2);
Bounded_String.Copy (The_Entry2, Entry2);
Bounded_String.Free (The_Entry3);
Bounded_String.Copy (The_Entry3, Entry3);
Entry_Count := 0;
if Bounded_String.Length (The_Entry1) > 0 then
Entry_Count := 1;
if Bounded_String.Length (The_Entry2) > 0 then
Entry_Count := 2;
if Bounded_String.Length (The_Entry3) > 0 then
Entry_Count := 3;
end if;
end if;
end if;
New_Node.all := (Return_Type => Entry_Type,
Kind => Player_Entry,
Nb_Param => Entry_Count,
Entry1 => The_Entry1,
Entry2 => The_Entry2,
Entry3 => The_Entry3);
return New_Node;
end Make_Node;
function Evaluate_Node (Node : Object;
Models_Table : Models.Object;
Symbols_Table : Symbols.Object) return Integer is
The_Integer : Integer;
begin
if Node.Return_Type /= Integer_Type and
Node.Return_Type /= Enumeration_Type then
raise Bad_Type;
end if;
case Node.Kind is
when Binary_Operator =>
case Node.Binary_Kind is
when Plus =>
return Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table) +
Evaluate_Node (Node.Right_Node,
Models_Table, Symbols_Table);
when Moins =>
return Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table) -
Evaluate_Node (Node.Right_Node,
Models_Table, Symbols_Table);
when Mul =>
return Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table) *
Evaluate_Node (Node.Right_Node,
Models_Table, Symbols_Table);
when Div =>
return Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table) /
Evaluate_Node (Node.Right_Node,
Models_Table, Symbols_Table);
when others =>
null;
end case;
when Integer_Data =>
return Node.Integer_Value;
when Var_Data =>
The_Integer := Symbols.Get_Symbol_Value
(Symbols_Table, Models_Table,
Image (Node.Var_Name),
Image (Node.Var_Extension));
return The_Integer;
when others =>
null;
end case;
end Evaluate_Node;
function Compare_Strings (A, B : String) return Boolean is
begin
return A = B;
end Compare_Strings;
function Evaluate_Node (Node : Object;
Models_Table : Models.Object;
Symbols_Table : Symbols.Object) return Boolean is
The_Bool1, The_Bool2 : Boolean;
The_Integer1, The_Integer2 : Integer;
begin
if Node.Return_Type /= Boolean_Type and
Node.Return_Type /= Entry_Type then
raise Bad_Type;
end if;
case Node.Kind is
when Binary_Operator =>
case Node.Left_Node.Return_Type is
when Boolean_Type =>
The_Bool1 := Evaluate_Node
(Node.Left_Node, Models_Table,
Symbols_Table);
The_Bool2 := Evaluate_Node
(Node.Right_Node,
Models_Table, Symbols_Table);
case Node.Binary_Kind is
when Equ =>
return The_Bool1 = The_Bool2;
when Diffr =>
return The_Bool1 /= The_Bool2;
when Et =>
return The_Bool1 and The_Bool2;
when Ou =>
return The_Bool1 or The_Bool2;
when others =>
null;
end case;
when Integer_Type =>
The_Integer1 :=
Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table);
The_Integer2 := Evaluate_Node
(Node.Right_Node,
Models_Table, Symbols_Table);
case Node.Binary_Kind is
when Equ =>
return The_Integer1 = The_Integer2;
when Diffr =>
return The_Integer1 /= The_Integer2;
when Inf =>
return The_Integer1 < The_Integer2;
when Infequ =>
return The_Integer1 <= The_Integer2;
when Sup =>
return The_Integer1 > The_Integer2;
when Supequ =>
return The_Integer1 >= The_Integer2;
when others =>
null;
end case;
when Enumeration_Type =>
The_Integer1 :=
Evaluate_Node (Node.Left_Node, Models_Table,
Symbols_Table);
The_Integer2 := Evaluate_Node
(Node.Right_Node,
Models_Table, Symbols_Table);
case Node.Binary_Kind is
when Equ =>
return The_Integer1 = The_Integer2;
when Diffr =>
return The_Integer1 /= The_Integer2;
when others =>
null;
end case;
when State_Type | Struct_Type =>
case Node.Binary_Kind is
when Equ =>
return Compare_Strings
(Evaluate_Node
(Node.Left_Node, Models_Table,
Symbols_Table),
Evaluate_Node
(Node.Right_Node, Models_Table,
Symbols_Table));
when Diffr =>
return not Compare_Strings
(Evaluate_Node
(Node.Left_Node, Models_Table,
Symbols_Table),
Evaluate_Node (Node.Right_Node,
Models_Table,
Symbols_Table));
when others =>
null;
end case;
when others =>
null;
end case;
when Unary_Operator =>
case Node.Unary_Kind is
when Non =>
return not Evaluate_Node (Node.Down_Node, Models_Table,
Symbols_Table);
when others =>
null;
end case;
when Boolean_Data =>
return Node.Boolean_Value;
when Var_Data =>
The_Bool1 := Symbols.Get_Symbol_Value
(Symbols_Table, Models_Table,
Image (Node.Var_Name),
Image (Node.Var_Extension));
return The_Bool1;
when Instruction =>
case Node.Instruction_Name is
when Existe_Connexion =>
return True;
-- if Image(Node.Param1) = "COMP" then
-- return Set_Of_Connections.Exist(Itr.First_Comp_Value(Comp),Image(Node.Param2),Connect);
-- else
-- if Image(Node.Param2) = "COMP" then
-- return Set_Of_Connections.Exist(Image(Node.Param1),Itr.First_Comp_Value(Comp),Connect);
-- end if;
-- end if;
-- return Set_Of_Connections.Exist(Image(Node.Param1),Image(Node.Param2),Connect);
when Existe_Lien =>
return True;
-- if Image(Node.Param1) = "COMP" then
-- return Set_Of_Links.Exist(Itr.First_Comp_Value(Comp),Image(Node.Param2),Links);
-- else
-- if Image(Node.Param2) = "COMP" then
-- return Set_Of_Links.Exist(Image(Node.Param1),Itr.First_Comp_Value(Comp),Links);
-- end if;
-- end if;
-- return Set_Of_Links.Exist(Image(Node.Param1),Image(Node.Param2),Links);
when others =>
null;
end case;
when Player_Entry =>
if Simulateur_Itr.Number_Of_Entries = Node.Nb_Param then
return Simulateur_Itr.Is_Entry
(Image (Node.Entry1), Image (Node.Entry2),
Image (Node.Entry3));
else
return False;
end if;
when others =>
null;
end case;
end Evaluate_Node;
function Evaluate_Node (Node : Object;
Models_Table : Models.Object;
Symbols_Table : Symbols.Object) return String is
begin
if Node.Return_Type /= Struct_Type and
Node.Return_Type /= State_Type then
raise Bad_Type;
end if;
case Node.Return_Type is
when Struct_Type =>
case Node.Kind is
when Instruction =>
return "CUISINE"; -- A modifier
-- if Image(Node.Param1) = "COMP" then
-- return Set_Of_Connections.What_Destination(Itr.First_Comp_Value(Comp),Image(Node.Param2),Connect);
-- else
-- if Image(Node.Param2) = "COMP" then
-- return Set_Of_Connections.What_Destination(Image(Node.Param1),Itr.First_Comp_Value(Comp),connect);
-- end if;
-- end if;
-- return Set_Of_Connections.What_Destination(Image(Node.Param1),Image(Node.Param2),Connect);
when Var_Data =>
if Symbols.Is_Pointer (Symbols_Table,
Image (Node.Var_Name)) then
return Symbols.Get_Pointer_Reference
(Symbols_Table, Image (Node.Var_Name));
else
return Image (Node.Var_Name);
end if;
when others =>
null;
end case;
when State_Type =>
case Node.Kind is
when Instruction =>
case Node.Instruction_Name is
when Etat_Connexion =>
return "LIE";
-- if Image(Node.Param1) = "COMP" then
-- if Set_Of_Connections.What_State(Itr.First_Comp_Value(Comp),Image(Node.Param2),Connect) = Set_Of_Connections.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
-- else
-- if Image(Node.Param2) = "COMP" then
-- if Set_Of_Connections.What_State(Image(Node.Param1),Itr.First_Comp_Value(Comp),Connect) = Set_Of_Connections.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
-- end if;
-- end if;
-- if Set_Of_Connections.What_State(Image(Node.Param1),Image(Node.Param2),Connect) = Set_Of_Connections.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
when Etat_Lien =>
return "LIE";
-- if Image(Node.Param1) = "COMP" then
-- if Set_Of_Links.What_State(Itr.First_Comp_Value(Comp),Image(Node.Param2),Links) = Set_Of_Links.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
-- else
-- if Image(Node.Param2) = "COMP" then
-- if Set_Of_Links.What_State(Image(Node.Param1),Itr.First_Comp_Value(Comp),Links) = Set_Of_Links.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
-- end if;
-- end if;
-- if Set_Of_Links.What_State(Image(Node.Param1),Image(Node.Param2),Links) = Set_Of_Links.Linked then
-- return "LIE";
-- else
-- return "DELIE";
-- end if;
when others =>
null;
end case;
when State_Data =>
return Token'Image (Node.State_Value);
when others =>
null;
end case;
when others =>
null;
end case;
end Evaluate_Node;
procedure Dump_Spaces (Nb : Integer) is
begin
for I in 1 .. Nb loop
Text_Io.Put (" ");
end loop;
end Dump_Spaces;
procedure Dump_Struct (Nb : Integer; Node : Object) is
begin
case Node.Kind is
when Binary_Operator =>
Dump_Struct (Nb + 2, Node.Left_Node);
Dump_Spaces (Nb);
case Node.Binary_Kind is
when Plus =>
Text_Io.Put_Line ("+");
when Moins =>
Text_Io.Put_Line ("-");
when Mul =>
Text_Io.Put_Line ("*");
when Div =>
Text_Io.Put_Line ("/");
when Equ =>
Text_Io.Put_Line ("=");
when Diffr =>
Text_Io.Put_Line ("<>");
when Inf =>
Text_Io.Put_Line ("<");
when Sup =>
Text_Io.Put_Line (">");
when Infequ =>
Text_Io.Put_Line ("<=");
when Supequ =>
Text_Io.Put_Line (">=");
when Et =>
Text_Io.Put_Line ("ET");
when Ou =>
Text_Io.Put_Line ("OU");
when others =>
null;
end case;
Dump_Struct (Nb + 2, Node.Right_Node);
when Unary_Operator =>
Dump_Spaces (Nb);
Text_Io.Put_Line ("NON");
Dump_Struct (Nb + 2, Node.Down_Node);
when Integer_Data =>
Dump_Spaces (Nb);
Text_Io.Put_Line (Integer'Image (Node.Integer_Value) & " (" &
Node_Type'Image (Node.Return_Type) & ")");
when Boolean_Data =>
Dump_Spaces (Nb);
Text_Io.Put_Line (Boolean'Image (Node.Boolean_Value));
when Var_Data =>
Dump_Spaces (Nb);
if Bounded_String.Length (Node.Var_Extension) = 0 then
Text_Io.Put (Image (Node.Var_Name));
else
Text_Io.Put (Image (Node.Var_Name) & "." &
Image (Node.Var_Extension));
end if;
Text_Io.Put_Line (" (" &
Node_Type'Image (Node.Return_Type) & ")");
when State_Data =>
Dump_Spaces (Nb);
Text_Io.Put_Line (Token'Image (Node.State_Value));
when Instruction =>
Dump_Spaces (Nb);
Text_Io.Put (Token'Image (Node.Instruction_Name) & "(");
Text_Io.Put (Image (Node.Param1) & ",");
Text_Io.Put_Line (Image (Node.Param2) & ")");
when Player_Entry =>
Dump_Spaces (Nb);
Text_Io.Put ("[" & Image (Node.Entry1));
Text_Io.Put (" " & Image (Node.Entry2));
Text_Io.Put_Line (" " & Image (Node.Entry3) & "]");
end case;
end Dump_Struct;
procedure Dump (Node : Object) is
begin
Dump_Struct (0, Node);
end Dump;
function What_Type (Node : Object) return Node_Type is
begin
return Node.Return_Type;
end What_Type;
end Abstract_Tree;
nblk1=27
nid=7
hdr6=48
[0x00] rec0=26 rec1=00 rec2=01 rec3=00a
[0x01] rec0=01 rec1=00 rec2=23 rec3=022
[0x02] rec0=18 rec1=00 rec2=1a rec3=02c
[0x03] rec0=18 rec1=00 rec2=1b rec3=012
[0x04] rec0=1e rec1=00 rec2=1c rec3=01c
[0x05] rec0=22 rec1=00 rec2=1e rec3=008
[0x06] rec0=1e rec1=00 rec2=02 rec3=044
[0x07] rec0=19 rec1=00 rec2=05 rec3=080
[0x08] rec0=1c rec1=00 rec2=15 rec3=012
[0x09] rec0=14 rec1=00 rec2=03 rec3=04e
[0x0a] rec0=1a rec1=00 rec2=06 rec3=018
[0x0b] rec0=1d rec1=00 rec2=09 rec3=026
[0x0c] rec0=1b rec1=00 rec2=08 rec3=046
[0x0d] rec0=1b rec1=00 rec2=0a rec3=002
[0x0e] rec0=17 rec1=00 rec2=24 rec3=03e
[0x0f] rec0=23 rec1=00 rec2=17 rec3=040
[0x10] rec0=01 rec1=00 rec2=25 rec3=05a
[0x11] rec0=1c rec1=00 rec2=0b rec3=040
[0x12] rec0=18 rec1=00 rec2=0d rec3=048
[0x13] rec0=1d rec1=00 rec2=0e rec3=01c
[0x14] rec0=13 rec1=00 rec2=0f rec3=010
[0x15] rec0=20 rec1=00 rec2=10 rec3=030
[0x16] rec0=04 rec1=00 rec2=0c rec3=03c
[0x17] rec0=12 rec1=00 rec2=13 rec3=0dc
[0x18] rec0=1b rec1=00 rec2=22 rec3=024
[0x19] rec0=14 rec1=00 rec2=21 rec3=04c
[0x1a] rec0=17 rec1=00 rec2=1d rec3=034
[0x1b] rec0=04 rec1=00 rec2=14 rec3=044
[0x1c] rec0=0f rec1=00 rec2=12 rec3=02c
[0x1d] rec0=11 rec1=00 rec2=16 rec3=00c
[0x1e] rec0=1a rec1=00 rec2=1f rec3=014
[0x1f] rec0=01 rec1=00 rec2=20 rec3=014
[0x20] rec0=1e rec1=00 rec2=19 rec3=022
[0x21] rec0=1e rec1=00 rec2=18 rec3=04c
[0x22] rec0=1c rec1=00 rec2=11 rec3=024
[0x23] rec0=13 rec1=00 rec2=04 rec3=000
[0x24] rec0=13 rec1=00 rec2=04 rec3=000
[0x25] rec0=13 rec1=00 rec2=04 rec3=000
[0x26] rec0=80 rec1=80 rec2=80 rec3=404
tail 0x21748c698865050420983 0x42a00088462060003
Free Block Chain:
0x7: 0000 00 26 02 24 80 02 70 65 02 00 4a 20 20 20 20 20 ┆ & $ pe J ┆
0x26: 0000 00 27 03 fc 80 12 6c 65 2c 20 4e 61 6d 65 2c 20 ┆ ' le, Name, ┆
0x27: 0000 00 00 00 08 80 05 61 6d 65 29 2c 05 00 00 00 00 ┆ ame), ┆