|
|
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: 6724 (0x1a44)
Types: TextFile
Notes: R1k Text-file segment
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦a82543151⟧
└─⟦this⟧
with dynamic_Value;
package dynamic_node is
type Kinds is (Unknown, Value,Binary_Operator,Unary_Operator);
type Positions is (Left, Right, Center);
type Binary_Operators is (Addition, Subtraction, Division, Multiplication);
type Unary_Operators is (Plus, Minus);
type Object is private;
Object_Already_Exists : exception;
Object_Is_Not_Created : exception;
Object_Is_Not_Evaluated : exception;
Value_Does_Not_Exist_Or_Is_Not_Evaluated : exception;
There_Is_No_Argument_On_Value : exception;
procedure Create_Value (Obj : in out Object);
procedure Set_Value(Obj : in out Object; val : in Dynamic_Value.Object);
procedure Create_Unary_Operator (Obj : in out Object; Op : Unary_Operators);
procedure Create_Binary_Operator (Obj : in out Object; Op : Binary_Operators);
function Get_Kind(Obj: in Object) return Kinds;
procedure Set_Argument (Obj : in out Object;
Arg : in Object;
Where : Positions := Center);
function Get_Argument
(Obj : in Object; Where : Positions := Center) return Object;
function Get_Value(Obj: in object) return Dynamic_Value.object;
procedure Evaluate(obj : in object);
private
type Node(What:kinds:=Unknown);
type Object is access Node;
type Arguments is array (Positions range <>) of Object;
type Node (What : Kinds := Unknown) is
record
case What is
when Value =>
Value_Content: Dynamic_Value.Object;
when Binary_Operator =>
Binary_Op : Binary_Operators;
Binary_Arg : Arguments (Left .. Right);
Binary_Result : Dynamic_Value.object;
when Unary_Operator =>
Unary_Op : Unary_Operators;
Unary_Arg : Object;
Unary_Result : Dynamic_Value.Object;
when others =>
null;
end case;
end record;
end Dynamic_Node;
package body dynamic_node is
procedure Create_Value (Obj : in out Object) is
d_v : Dynamic_Value.Object;
begin
if (Obj=null) then
Obj:=new Node'(what=> Value, Value_Content => d_v);
else
raise Object_Already_Exists;
end if;
end Create_Value;
procedure Set_Value(Obj : in out Object; val : in Dynamic_Value.Object) is
begin
if (Dynamic_Value.Get_Kind(Val) = Dynamic_Value.Unknown)
then
raise Value_Does_Not_Exist_Or_Is_Not_Evaluated;
else
Obj.all.Value_Content:=val;
end if;
end Set_Value;
procedure Create_Unary_Operator (Obj : in out Object; Op : Unary_Operators) is
d_v : Dynamic_Value.Object;
begin
if (Obj=null) then
Obj:=new Node'(what=> Unary_Operator,
Unary_Op => Op,
Unary_Arg=> null,
Unary_result => d_v);
else
raise Object_Already_Exists;
end if;
end Create_Unary_Operator;
procedure Create_Binary_Operator (Obj : in out Object; Op : Binary_Operators) is
d_v : Dynamic_Value.Object;
begin
if (Obj=null) then
Obj:=new Node'(what=> Binary_Operator,
Binary_Op => Op,
Binary_Arg => (null,null),
Binary_Result => d_v);
else
raise Object_Already_Exists;
end if;
end Create_Binary_Operator;
function Get_Kind(Obj: in Object) return Kinds is
begin
return Obj.all.what;
end Get_Kind;
procedure Set_Argument (Obj : in out Object;
Arg : in Object;
Where : Positions := Center) is
begin
case Get_Kind(Obj) is
when Value => raise There_Is_No_Argument_On_Value;
when Unary_Operator => Obj.all.Unary_Arg:= Arg;
when Binary_Operator => Obj.all.Binary_Arg(Where):=Arg;
when Unknown => raise Object_Is_Not_Created;
end case;
end Set_Argument;
function Get_Argument(Obj : in Object; Where : Positions := Center) return Object is
begin
case Get_Kind(Obj) is
when Value => raise There_Is_No_Argument_On_Value;
when Unary_Operator => return Obj.all.Unary_Arg;
when Binary_Operator => return Obj.all.Binary_Arg(Where);
when Unknown => raise Object_Is_Not_Created;
end case;
end Get_Argument;
function Get_Value(Obj: in object) return Dynamic_Value.object is
begin
case Obj.all.what is
when Value =>
if (Dynamic_Value.Get_Kind(obj.all.value_Content) = Dynamic_Value.Unknown)
then raise Value_Does_Not_Exist_Or_Is_Not_Evaluated;
else return obj.all.Value_Content;
end if;
when Unary_Operator =>
if (Dynamic_Value.Get_Kind(obj.all.Unary_Result) = Dynamic_Value.Unknown)
then raise Value_Does_Not_Exist_Or_Is_Not_Evaluated;
else return obj.all.Unary_Result;
end if;
when Binary_Operator =>
if (Dynamic_Value.Get_Kind(obj.all.Binary_Result) = Dynamic_Value.Unknown)
then raise Value_Does_Not_Exist_Or_Is_Not_Evaluated;
else return obj.all.Binary_Result;
end if;
when others => raise Object_Is_Not_Created;
end case;
end Get_Value;
procedure Evaluate_Unary_Operator(obj : in object) is
begin
Evaluate(Get_Argument(obj));
case obj.all.Unary_op is
when plus =>
Dynamic_Value.Copy(Get_Value(Get_Argument(obj)),Obj.all.unary_Result);
when minus =>
Dynamic_Value.Change_Sign(Get_Value(Get_Argument(obj)),Obj.all.unary_Result);
end case;
end Evaluate_Unary_Operator;
procedure Evaluate_Binary_Operator(obj : in object) is
tempo1,tempo2:Dynamic_Value.Object;
begin
Evaluate(Get_Argument(obj,left));
Dynamic_Value.Copy(Get_Value(Get_Argument(obj,left)), tempo1);
Evaluate(Get_Argument(obj,right));
Dynamic_Value.Copy(Get_Value(Get_Argument(obj,right)), tempo2);
case obj.all.Binary_op is
when Addition =>
Dynamic_Value.Add (left =>tempo1, right => tempo2, result => obj.all.binary_result);
when Subtraction =>
Dynamic_Value.Substract (tempo1, tempo2, obj.all.binary_result);
when Division =>
Dynamic_Value.Divide (tempo1, tempo2, obj.all.binary_result);
when Multiplication =>
Dynamic_Value.Multiply (tempo1, tempo2, obj.all.binary_result);
end case;
end Evaluate_Binary_Operator;
procedure Evaluate(obj : in object) is
begin
case get_Kind(obj) is
when Value => null;
when Unary_operator => Evaluate_Unary_Operator(obj);
when Binary_operator => Evaluate_Binary_Operator(obj);
when Unknown => raise Object_Is_Not_Created;
end case;
end Evaluate;
end Dynamic_Node