DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 11269 (0x2c05) Types: TextFile Names: »B«
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16 └─ ⟦6f12a12be⟧ »DATA« └─⟦this⟧
package body Generic_Expression is type Alias_Storage is array (Alias) of Integer; The_Aliases : Alias_Storage := (others => 0); type Kind_Of_Operation is (System_Defined_Operator, User_Defined_Operator, Value_Definition, Alias_Definition, Alias_Reference, Predicate_Conjunction, Undefined); -- predicates have only left nodes type Intermediate_Code (Kind : Kind_Of_Operation := Undefined) is record Is_Predicate : Boolean := False; case Kind is when System_Defined_Operator => The_System_Operator : System_Defined_Operators; The_Left_System_Operand : Object; The_Right_System_Operand : Object; when User_Defined_Operator => The_User_Operator : User_Defined_Operators; The_Left_User_Operand : Object; The_Right_User_Operand : Object; when Value_Definition => The_Value : Integer; when Alias_Definition => The_Defined_Alias : Alias; when Alias_Reference => The_Referenced_Alias : Alias; when Predicate_Conjunction => The_Left_Predicate : Object; The_Right_Predicate : Object; when Undefined => null; end case; end record; type Intermediate_Codes is array (Object range <>) of Intermediate_Code; The_Expressions : Intermediate_Codes (1 .. Object (Max_Expression_Count)) := (others => Intermediate_Code'(Kind => Undefined, Is_Predicate => False)); The_Last_Expression : Object := 0; function New_Node (For_Code : Intermediate_Code) return Object is begin if The_Last_Expression = Object (Max_Expression_Count) then raise Overflow; else The_Last_Expression := The_Last_Expression + 1; The_Expressions (The_Last_Expression) := For_Code; return The_Last_Expression; end if; end New_Node; function Value (For_Integer : Integer) return Object is begin return New_Node (For_Code => (Kind => Value_Definition, Is_Predicate => False, The_Value => For_Integer)); end Value; function Value (For_Alias : Alias) return Object is begin return New_Node (For_Code => (Kind => Alias_Reference, Is_Predicate => False, The_Referenced_Alias => For_Alias)); end Value; function Define_As (The_Alias : Alias) return Object is begin return New_Node (For_Code => (Kind => Alias_Definition, Is_Predicate => True, The_Defined_Alias => The_Alias)); end Define_As; function "and" (Left, Right : Object) return Object is The_Left_Code, The_Right_Code : Intermediate_Code; begin if Left = Null_Expression then return Right; elsif Right = Null_Expression then return Left; else The_Left_Code := The_Expressions (Left); The_Right_Code := The_Expressions (Right); if The_Left_Code.Is_Predicate and The_Right_Code.Is_Predicate then return New_Node (For_Code => (Kind => Predicate_Conjunction, Is_Predicate => True, The_Left_Predicate => Left, The_Right_Predicate => Right)); else raise Illegal_Operation; end if; end if; end "and"; function Unary_System_Predicate return Object is begin return New_Node (For_Code => (Kind => System_Defined_Operator, Is_Predicate => True, The_System_Operator => Operator, The_Left_System_Operand | The_Right_System_Operand => Null_Expression)); end Unary_System_Predicate; function Binary_System_Predicate (Using_Value : Object) return Object is begin return New_Node (For_Code => (Kind => System_Defined_Operator, Is_Predicate => True, The_System_Operator => Operator, The_Left_System_Operand => Using_Value, The_Right_System_Operand => Null_Expression)); end Binary_System_Predicate; function Unary_System_Expression (Using_Value : Object) return Object is begin return New_Node (For_Code => (Kind => System_Defined_Operator, Is_Predicate => False, The_System_Operator => Operator, The_Left_System_Operand => Using_Value, The_Right_System_Operand => Null_Expression)); end Unary_System_Expression; function Binary_System_Expression (Left, Right : Object) return Object is begin return New_Node (For_Code => (Kind => System_Defined_Operator, Is_Predicate => False, The_System_Operator => Operator, The_Left_System_Operand => Left, The_Right_System_Operand => Right)); end Binary_System_Expression; function Unary_User_Predicate return Object is begin return New_Node (For_Code => (Kind => User_Defined_Operator, Is_Predicate => True, The_User_Operator => Operator, The_Left_User_Operand | The_Right_User_Operand => Null_Expression)); end Unary_User_Predicate; function Binary_User_Predicate (Using_Value : Object) return Object is begin return New_Node (For_Code => (Kind => User_Defined_Operator, Is_Predicate => True, The_User_Operator => Operator, The_Left_User_Operand => Using_Value, The_Right_User_Operand => Null_Expression)); end Binary_User_Predicate; function Unary_User_Expression (Using_Value : Object) return Object is begin return New_Node (For_Code => (Kind => User_Defined_Operator, Is_Predicate => False, The_User_Operator => Operator, The_Left_User_Operand => Using_Value, The_Right_User_Operand => Null_Expression)); end Unary_User_Expression; function Binary_User_Expression (Left, Right : Object) return Object is begin return New_Node (For_Code => (Kind => User_Defined_Operator, Is_Predicate => False, The_User_Operator => Operator, The_Left_User_Operand => Left, The_Right_User_Operand => Right)); end Binary_User_Expression; function Evaluate (The_Expression : Object) return Integer is The_Code : Intermediate_Code; begin if The_Expression = Null_Expression then return 0; else The_Code := The_Expressions (The_Expression); if The_Code.Is_Predicate then raise Illegal_Operation; else case The_Code.Kind is when System_Defined_Operator => return System_Defined_Evaluate (Using_Operator => The_Code.The_System_Operator, Left => Evaluate (The_Code.The_Left_System_Operand), Right => Evaluate (The_Code.The_Right_System_Operand)); when User_Defined_Operator => return User_Defined_Evaluate (Using_Operator => The_Code.The_User_Operator, Left => Evaluate (The_Code.The_Left_User_Operand), Right => Evaluate (The_Code.The_Right_User_Operand)); when Value_Definition => return The_Code.The_Value; when Alias_Reference => return The_Aliases (The_Code.The_Referenced_Alias); when Alias_Definition | Predicate_Conjunction | Undefined => raise Illegal_Operation; end case; end if; end if; end Evaluate; function Match (Value : Integer; Against : Object) return Boolean is The_Code : Intermediate_Code := The_Expressions (Against); begin if The_Code.Is_Predicate then case The_Code.Kind is when System_Defined_Operator => return System_Defined_Match (The_Code.The_System_Operator, Value, Against => Evaluate (The_Code.The_Left_System_Operand)); when User_Defined_Operator => return User_Defined_Match (The_Code.The_User_Operator, Value, Against => Evaluate (The_Code.The_Left_User_Operand)); when Alias_Definition => The_Aliases (The_Code.The_Defined_Alias) := Value; return True; when Predicate_Conjunction => return Match (Value, Against => The_Code.The_Left_Predicate) and then Match (Value, Against => The_Code.The_Right_Predicate); when Value_Definition | Alias_Reference | Undefined => raise Illegal_Operation; end case; else raise Illegal_Operation; end if; end Match; procedure Put (The_Object : Object; Where : Output_Stream.Object) is begin null; end Put; end Generic_Expression;