|
|
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: 11264 (0x2c00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Boolean_Expressions, seg_004616
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Ada_Program;
with Diana;
package body Boolean_Expressions is
Other_Operator : exception;
package Ada renames Ada_Program;
function Kind (Op : Operator) return Expression_Kind is
begin
case Op is
when Unary_Not_Operator =>
return Not_Expression;
when Logical_Operator =>
return Expression;
when Relational_Operator =>
return Relation;
when Membership_Op =>
return Membership;
when Short_Circuit_Operator =>
return Expression;
when Not_An_Operator =>
return Not_An_Expression;
end case;
end Kind;
function Get_Operator (Node : Diana.Tree) return Operator is
begin
case Diana.Kind (Node) is
when Diana.Dn_In_Op =>
return In_Op;
when Diana.Dn_Not_In =>
return Not_In_Op;
when others =>
declare
Name : constant String :=
Diana.Image (Diana.Lx_Symrep (Node));
begin
if Name = "and" then
return And_Op;
elsif Name = "or" then
return Or_Op;
elsif Name = "xor" then
return Xor_Op;
elsif Name = "not" then
return Not_Op;
elsif Name = "=" then
return Equal;
elsif Name = "/=" then
return Not_Equal;
elsif Name = "<" then
return Less_Than;
elsif Name = "<=" then
return Less_Than_Or_Equal;
elsif Name = ">" then
return Greater_Than;
elsif Name = ">=" then
return Greater_Than_Or_Equal;
else
raise Other_Operator;
end if;
end;
end case;
end Get_Operator;
function Kind (An_Expression : Ada_Program.Element)
return Expression_Kind is
Local : Diana.Tree := Ada.Conversion.Convert (An_Expression);
begin
loop
case Diana.Kind (Local) is
when Diana.Dn_Cond_Clause =>
Local := Diana.As_Exp_Void (Local);
when Diana.Dn_Parenthesized =>
Local := Diana.As_Exp (Local);
when Diana.Dn_Selected =>
Local := Diana.As_Designator_Char (Local);
when Diana.Dn_Function_Call =>
return Kind (Expression_Operator
(Ada.Conversion.Convert (Local)));
when Diana.Dn_Binary =>
return Kind (Expression_Operator
(Ada.Conversion.Convert (Local)));
when Diana.Dn_Numeric_Literal =>
return Literal;
when Diana.Dn_Membership =>
return Membership;
when Diana.Dn_Attribute =>
return Attribute;
when Diana.Dn_Used_Object_Id =>
case Diana.Kind (Diana.Sm_Exp_Type (Local)) is
when Diana.Dn_Enum_Literal_S =>
return Literal;
when others =>
return Identifier;
end case;
when Diana.Dn_Range =>
return Membership_Range;
when others =>
return Not_An_Expression;
end case;
end loop;
exception
when Other_Operator =>
return Function_Call;
when Program_Error =>
return Not_An_Expression;
when others =>
return Not_An_Expression;
end Kind;
function Expression_Operator
(An_Expression : Ada_Program.Element) return Operator is
Local : Diana.Tree := Ada.Conversion.Convert (An_Expression);
begin
loop
case Diana.Kind (Local) is
when Diana.Dn_Cond_Clause =>
Local := Diana.As_Exp_Void (Local);
when Diana.Dn_Parenthesized =>
Local := Diana.As_Exp (Local);
when Diana.Dn_Function_Call =>
Local := Diana.As_Name (Local);
when Diana.Dn_Membership =>
return Get_Operator (Diana.As_Membership_Op (Local));
when Diana.Dn_Used_Op =>
return Get_Operator (Local);
when Diana.Dn_Used_Bltn_Op =>
return Get_Operator (Local);
when Diana.Dn_Binary =>
case Diana.Kind (Diana.As_Binary_Op (Local)) is
when Diana.Dn_Or_Else =>
return Or_Else_Op;
when Diana.Dn_And_Then =>
return And_Then_Op;
when others =>
raise Program_Error;
end case;
when Diana.Dn_Selected =>
Local := Diana.As_Designator_Char (Local);
when others =>
raise Other_Operator;
end case;
end loop;
end Expression_Operator;
function Get_Arg (List : Diana.Seq_Type; Arg_Num : Positive)
return Ada.Element is
Local : Diana.Seq_Type := List;
begin
for I in 1 .. Arg_Num - 1 loop
Local := Diana.Tail (Local);
end loop;
return Ada.Conversion.Convert (Diana.Head (Local));
end Get_Arg;
function Left_Argument (An_Expression : Ada_Program.Element)
return Ada_Program.Element is
Local : Diana.Tree := Ada.Conversion.Convert (An_Expression);
begin
loop
case Diana.Kind (Local) is
when Diana.Dn_Parenthesized =>
Local := Diana.As_Exp (Local);
when Diana.Dn_Function_Call =>
Local := Diana.As_Param_Assoc_S (Local);
when Diana.Dn_Param_Assoc_S =>
return Get_Arg (Diana.As_List (Local), 1);
when Diana.Dn_Binary =>
return Ada.Conversion.Convert (Diana.As_Exp1 (Local));
when Diana.Dn_Membership =>
return Ada.Conversion.Convert (Diana.As_Exp (Local));
when others =>
raise Program_Error;
end case; end loop;
end Left_Argument;
function Right_Argument (An_Expression : Ada_Program.Element)
return Ada_Program.Element is
Local : Diana.Tree := Ada.Conversion.Convert (An_Expression);
begin
loop
case Diana.Kind (Local) is
when Diana.Dn_Parenthesized =>
Local := Diana.As_Exp (Local);
when Diana.Dn_Function_Call =>
Local := Diana.As_Param_Assoc_S (Local);
when Diana.Dn_Param_Assoc_S =>
return Get_Arg (Diana.As_List (Local), 2);
when Diana.Dn_Binary =>
return Ada.Conversion.Convert (Diana.As_Exp2 (Local));
when Diana.Dn_Membership =>
return Ada.Conversion.Convert (Diana.As_Type_Range (Local));
when others =>
raise Program_Error;
end case;
end loop;
end Right_Argument;
function Argument (A_Not_Expression : Ada_Program.Element)
return Ada_Program.Element is
Local : Diana.Tree := Ada.Conversion.Convert (A_Not_Expression);
begin
loop
case Diana.Kind (Local) is
when Diana.Dn_Parenthesized =>
Local := Diana.As_Exp (Local);
when Diana.Dn_Function_Call =>
Local := Diana.As_Param_Assoc_S (Local);
when Diana.Dn_Param_Assoc_S =>
return Get_Arg (Diana.As_List (Local), 1);
when others =>
raise Program_Error;
end case;
end loop;
end Argument;
function Image (Op : Operator) return String is
begin
case Op is
when And_Op =>
return "and";
when Or_Op =>
return "or";
when Xor_Op =>
return "xor";
when And_Then_Op =>
return "and then";
when Or_Else_Op =>
return "or else";
when Not_Op =>
return "not";
when Equal =>
return "=";
when Not_Equal =>
return "/=";
when Less_Than =>
return "<";
when Greater_Than =>
return ">";
when Less_Than_Or_Equal =>
return "<=";
when Greater_Than_Or_Equal =>
return ">=";
when In_Op =>
return "in";
when Not_In_Op =>
return "not in";
when Not_An_Operator =>
return "<UNKNOWN>";
end case;
end Image;
end Boolean_Expressions;
nblk1=a
nid=0
hdr6=14
[0x00] rec0=22 rec1=00 rec2=01 rec3=040
[0x01] rec0=18 rec1=00 rec2=02 rec3=03c
[0x02] rec0=18 rec1=00 rec2=03 rec3=044
[0x03] rec0=19 rec1=00 rec2=04 rec3=010
[0x04] rec0=18 rec1=00 rec2=05 rec3=012
[0x05] rec0=19 rec1=00 rec2=06 rec3=006
[0x06] rec0=16 rec1=00 rec2=07 rec3=002
[0x07] rec0=17 rec1=00 rec2=08 rec3=00c
[0x08] rec0=1c rec1=00 rec2=09 rec3=032
[0x09] rec0=1d rec1=00 rec2=0a rec3=000
tail 0x217002450815c65b80806 0x42a00088462061e03