DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦47786fa0c⟧ Ada Source

    Length: 32768 (0x8000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Compiler_Action, seg_048a5c

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io, Error, Dynamic_Value, Unbounded_String;
package body Compiler_Action is

    package Unlimited_String is new Unbounded_String (10);

    package Argument_List is new Queue_Generic (Dynamic_Value.Object);
    type Acces_Argument_List is access Argument_List.Queue;

    type Action_Node (What : Action_Kinds := Unknown_Action) is
        record
            case What is
                when Unknown_Action =>
                    null;
                when Write_Action =>
                    List_Of_Argument : Acces_Argument_List;
                when Conditional_Action =>
                    The_Condition : Dynamic_Node.Object;
                    The_True_Bloc : Acces_List;
                    The_False_Bloc : Acces_List;
                    Evaluation_Flag : Boolean;
                when Affect_Action =>
                    The_Source : Dynamic_Node.Object;
                    The_Target : Dynamic_Node.Object;
                when Append_In_Set_Of_Word =>
                    The_Word : Dynamic_Node.Object;
                    The_Target_Set : Dynamic_Node.Object;  
                when Remove_From_Set_Of_Word =>
                    The_Out_Word : Dynamic_Node.Object;
                    The_Reduced_Set : Dynamic_Node.Object;
                when Clear_Set_Of_Word =>
                    The_Set : Dynamic_Node.Object;
                when Quit_Action =>
                    null;  
            end case;
        end record;


    procedure Create_Action (The_Action : in out Object; What : Action_Kinds) is
        D_N1, D_N2 : Dynamic_Node.Object;
        A_L_T, A_L_F : Acces_List;
        A_Arg_List : Acces_Argument_List;
        D_N : Dynamic_Node.Object;
        An_Action : Object;
    begin
        case What is
            when Write_Action =>  
                A_Arg_List := new Argument_List.Queue;
                Argument_List.Make_Empty (A_Arg_List.all);
                The_Action := new Action_Node'(What => Write_Action,
                                               List_Of_Argument => A_Arg_List);

            when Conditional_Action =>
                A_L_T := new Action_List.Queue;
                Action_List.Make_Empty (A_L_T.all);
                A_L_F := new Action_List.Queue;
                Action_List.Make_Empty (A_L_F.all);
                The_Action := new Action_Node'(What => Conditional_Action,
                                               The_Condition => D_N,
                                               The_True_Bloc => A_L_T,
                                               The_False_Bloc => A_L_F,
                                               Evaluation_Flag => True);
            when Affect_Action =>  
                The_Action := new Action_Node'(What => Affect_Action,
                                               The_Source => D_N,
                                               The_Target => D_N);

            when Append_In_Set_Of_Word =>
                Dynamic_Node.Create_Value (D_N1);
                Dynamic_Node.Create_Value (D_N2);
                The_Action := new Action_Node'(What => Append_In_Set_Of_Word,
                                               The_Word => D_N1,
                                               The_Target_Set => D_N2);
            when Remove_From_Set_Of_Word =>
                Dynamic_Node.Create_Value (D_N1);
                Dynamic_Node.Create_Value (D_N2);
                The_Action := new Action_Node'(What => Remove_From_Set_Of_Word,
                                               The_Out_Word => D_N1,
                                               The_Reduced_Set => D_N2);
            when Clear_Set_Of_Word =>
                Dynamic_Node.Create_Value (D_N);
                The_Action := new Action_Node'(What => Clear_Set_Of_Word,
                                               The_Set => D_N);
            when Quit_Action =>
                The_Action := new Action_Node'(What => Quit_Action);
            when Unknown_Action =>
                null;
        end case;
    end Create_Action;


    procedure Create_List (The_Action_List : in out Acces_List) is
    begin
        The_Action_List := new Action_List.Queue;
        Action_List.Make_Empty (The_Action_List.all);  
    end Create_List;


    procedure Set_Write_Argument (The_Action : in out Object;
                                  Argument_Type : Argument_Kinds;  
                                  The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
        Tmp_Arg : Dynamic_Value.Object;
    begin  
        if (Argument_Type /= Write_Argument) then
            raise Bad_Argument_Type;
        end if;
        --if ((Dynamic_Node.Get_Type_Of_Object (The_Argument) =
        --     Dynamic_Node.Type_Unknown) or
        --    (Dynamic_Node.Get_Type_Of_Object (The_Argument) =
        --     Dynamic_Node.Type_Bool)) then

        if (Dynamic_Node.Get_Operator (The_Argument) /= "UNKNOWN") then
            -- donc c'est un operateur unaire, binaire, ou ternaire et pas une value
            Error.Set_Type_Error (Error.Unauthorized_Type_For_Write);
            raise Error.Excep_Semantic_Error;
        end if;  
        Tmp_Arg := Dynamic_Node.Get_Value (The_Argument);  
        Argument_List.Add (The_Action.List_Of_Argument.all, Tmp_Arg);
    end Set_Write_Argument;


    procedure Set_Affect_Argument (The_Action : in out Object;
                                   Argument_Type : Argument_Kinds;
                                   The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
    begin
        if ((Argument_Type /= Source_Argument) and
            (Argument_Type /= Target_Argument)) then  
            raise Bad_Argument_Type;
        end if;
        if (Argument_Type = Source_Argument) then
            if (Dynamic_Node.Get_Kind (The_Action.The_Target) /=
                Dynamic_Node.Unknown) then
                if ((Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Get_Type_Of_Object
                        (The_Action.The_Target))) then
                    Error.Set_Type_Error
                       (Error.
                        Unauthorized_Type_With_Target_Argument_Of_Affectation);
                    raise Error.Excep_Semantic_Error;
                end if;
            else
                if ((Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Type_Int) and
                    (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Type_String)) then
                    Error.Set_Type_Error
                       (Error.Unauthorized_Type_For_Any_Affectation);
                    raise Error.Excep_Semantic_Error;
                end if;
            end if;
            The_Action.The_Source := The_Argument;
        else                                   -- cas de la cible
            if (Dynamic_Node.Get_Kind (The_Action.The_Source) /=
                Dynamic_Node.Unknown) then
                if ((Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Get_Type_Of_Object
                        (The_Action.The_Source))) then
                    Error.Set_Type_Error
                       (Error.
                        Unauthorized_Type_With_Source_Argument_Of_Affectation);
                    raise Error.Excep_Semantic_Error;  
                end if;
            else
                if ((Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Type_Int) and
                    (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                     Dynamic_Node.Type_String)) then
                    Error.Set_Type_Error
                       (Error.Unauthorized_Type_For_Any_Affectation);
                    raise Error.Excep_Semantic_Error;  
                end if;
            end if;
            The_Action.The_Target := The_Argument;
        end if;
    end Set_Affect_Argument;


    procedure Set_Append_Argument (The_Action : in out Object;
                                   Argument_Type : Argument_Kinds;
                                   The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
    begin
        if ((Argument_Type /= Source_Argument) and
            (Argument_Type /= Target_Argument)) then
            raise Bad_Argument_Type;
        end if;
        if (Argument_Type = Source_Argument) then
            if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                Dynamic_Node.Type_Voca) then  
                Error.Set_Type_Error (Error.Word_Was_Expected);
                raise Error.Excep_Semantic_Error;
            end if;
            The_Action.The_Word := The_Argument;
        else
            if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                Dynamic_Node.Type_Set_Words) then
                Error.Set_Type_Error (Error.Set_Was_Expected);
                raise Error.Excep_Semantic_Error;
            end if;
            The_Action.The_Target_Set := The_Argument;
        end if;
    end Set_Append_Argument;


    procedure Set_Remove_Argument (The_Action : in out Object;
                                   Argument_Type : Argument_Kinds;
                                   The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
    begin
        if ((Argument_Type /= Source_Argument) and
            (Argument_Type /= Target_Argument)) then
            raise Bad_Argument_Type;
        end if;
        if (Argument_Type = Source_Argument) then
            if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                Dynamic_Node.Type_Voca) then
                Error.Set_Type_Error (Error.Word_Was_Expected);
                raise Error.Excep_Semantic_Error;
            end if;
            The_Action.The_Out_Word := The_Argument;
        else
            if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
                Dynamic_Node.Type_Set_Words) then
                Error.Set_Type_Error (Error.Set_Was_Expected);
                raise Error.Excep_Semantic_Error;
            end if;
            The_Action.The_Reduced_Set := The_Argument;
        end if;  
    end Set_Remove_Argument;


    procedure Set_Clear_Argument (The_Action : in out Object;
                                  Argument_Type : Argument_Kinds;
                                  The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
    begin
        if (Argument_Type /= Target_Argument) then
            raise Bad_Argument_Type;
        end if;
        if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
            Dynamic_Node.Type_Set_Words) then
            Error.Set_Type_Error (Error.Set_Was_Expected);
            raise Error.Excep_Semantic_Error;
        end if;
        The_Action.The_Set := The_Argument;
    end Set_Clear_Argument;


    procedure Set_Condition (The_Action : in out Object;
                             Argument_Type : Argument_Kinds;
                             The_Argument : Dynamic_Node.Object) is
        use Dynamic_Node;
    begin
        if (Argument_Type /= Condition_Argument) then
            raise Bad_Argument_Type;
        end if;
        if (Dynamic_Node.Get_Type_Of_Object (The_Argument) /=
            Dynamic_Node.Type_Bool) then
            Error.Set_Type_Error (Error.Boolean_Was_Expected);
            raise Error.Excep_Semantic_Error;
        end if;
        The_Action.The_Condition := The_Argument;
    end Set_Condition;


    procedure Set_Argument (The_Action : in out Object;
                            Argument_Type : Argument_Kinds;
                            The_Argument : Dynamic_Node.Object) is
    begin
        case The_Action.What is
            when Write_Action =>
                Set_Write_Argument (The_Action, Argument_Type, The_Argument);
            when Affect_Action =>
                Set_Affect_Argument (The_Action, Argument_Type, The_Argument);
            when Append_In_Set_Of_Word =>
                Set_Append_Argument (The_Action, Argument_Type, The_Argument);
            when Remove_From_Set_Of_Word =>
                Set_Remove_Argument (The_Action, Argument_Type, The_Argument);
            when Clear_Set_Of_Word =>
                Set_Clear_Argument (The_Action, Argument_Type, The_Argument);
            when Conditional_Action =>
                Set_Condition (The_Action, Argument_Type, The_Argument);
            when Quit_Action | Unknown_Action =>
                null;
        end case;
    end Set_Argument;


    procedure Set_Argument (The_Action : in out Object;
                            Argument_Type : Argument_Kinds;
                            The_Argument : Object) is
    begin
        case Argument_Type is
            when True_Component =>
                Action_List.Add (The_Action.The_True_Bloc.all, The_Argument);
            when False_Component =>
                Action_List.Add (The_Action.The_False_Bloc.all, The_Argument);
            when others =>
                raise Bad_Argument_Type;
        end case;
    end Set_Argument;


    function Get_True_Bloc (Of_Action : Object) return Acces_List is
    begin
        if Of_Action.What = Conditional_Action then
            return Of_Action.The_True_Bloc;
        else
            raise Bad_Argument_Type;
        end if;
    end Get_True_Bloc;


    function Get_False_Bloc (Of_Action : Object) return Acces_List is
    begin
        if Of_Action.What = Conditional_Action then
            return Of_Action.The_False_Bloc;
        else
            raise Bad_Argument_Type;
        end if;
    end Get_False_Bloc;


    function Get_Kind (Of_Action : Object) return Action_Kinds is
    begin
        return Of_Action.What;
    end Get_Kind;


    procedure Print_Action (The_Action : Object) is
    begin
        case The_Action.What is
            when Write_Action =>
                Text_Io.Put_Line ("ACTION ECRIRE");
            when Conditional_Action =>
                Text_Io.Put_Line ("ACTION CONDITIONNELLE, de condition");
                Dynamic_Node.Print (The_Action.The_Condition);
            when Affect_Action =>
                Text_Io.Put_Line ("ACTION AFFECTATION");
                Text_Io.New_Line;
                Dynamic_Node.Print (The_Action.The_Source);
                Text_Io.New_Line;
                Dynamic_Node.Print (The_Action.The_Target);
            when Append_In_Set_Of_Word =>
                Text_Io.Put_Line ("ACTION AJOUT ENSEMBLE");  
            when Remove_From_Set_Of_Word =>
                Text_Io.Put_Line ("ACTION RETIRER ENSEMBLE");  
            when Clear_Set_Of_Word =>
                Text_Io.Put_Line ("ACTION VIDER ENSEMBLE");  
            when Quit_Action =>
                Text_Io.Put_Line ("ACTIION QUITTER");
            when others =>
                null;
        end case;
    end Print_Action;


    procedure Print_List (The_List : Acces_List) is
        It : Action_List.Iterator;
    begin
        Action_List.Init (It, The_List.all);
        while not Action_List.Done (It) loop
            Print_Action (Action_List.Value (It));
            Action_List.Next (It);
        end loop;
    end Print_List;


    procedure Evaluate_Action (The_Action : Object) is  
    begin
        case The_Action.What is
            when Conditional_Action =>
                Dynamic_Node.Evaluate (The_Action.The_Condition);
                The_Action.Evaluation_Flag :=
                   Dynamic_Value.Get_Value (Dynamic_Node.Get_Value
                                               (The_Action.The_Condition));  
                if (The_Action.Evaluation_Flag) then
                    Evaluate (The_Action.The_True_Bloc);
                else
                    Evaluate (The_Action.The_False_Bloc);
                end if;  
            when others =>
                null;
        end case;
    end Evaluate_Action;


    procedure Execute_Action (The_Action : in Object) is
        It : Action_List.Iterator;
        It_Arg : Argument_List.Iterator;
        Cond, Sv, Tv : Dynamic_Value.Object;
        Arg_Kind : Dynamic_Value.Kinds;
        I : Integer;  
        S : Unlimited_String.Variable_String;
        use Dynamic_Value;
    begin
        case The_Action.What is
            when Write_Action =>
                Argument_List.Init (It_Arg, The_Action.List_Of_Argument.all);
                while not Argument_List.Done (It_Arg) loop
                    Arg_Kind := Dynamic_Value.Get_Kind
                                   (Argument_List.Value (It_Arg));
                    case Arg_Kind is
                        when Dynamic_Value.String_Of_Characters |
                             Dynamic_Value.Vocabulary_Word =>
                            Text_Io.Put (Dynamic_Value.Get_Value
                                            (Argument_List.Value (It_Arg)));
                        when Dynamic_Value.Integer_Number =>
                            Text_Io.Put (Integer'Image (Dynamic_Value.Get_Value
                                                           (Argument_List.Value
                                                               (It_Arg))));
                        when Dynamic_Value.Set_Of_Words =>
                            Text_Io.New_Line;
                            Dynamic_Value.Print (Argument_List.Value (It_Arg));
                        when Dynamic_Value.Boolean_Number |
                             Dynamic_Value.Unknown =>  
                            null;
                    end case;
                    Argument_List.Next (It_Arg);  
                end loop;
                Text_Io.New_Line;

            when Conditional_Action =>
                if (The_Action.Evaluation_Flag = True) then
                    Execute (The_Action.The_True_Bloc);
                else
                    Execute (The_Action.The_False_Bloc);
                end if;

            when Affect_Action =>
                Dynamic_Node.Evaluate (The_Action.The_Source);
                Dynamic_Node.Evaluate (The_Action.The_Target);  
                Sv := Dynamic_Node.Get_Value (The_Action.The_Source);
                Tv := Dynamic_Node.Get_Value (The_Action.The_Target);
                if (Dynamic_Value.Get_Kind (Sv) =  
                    Dynamic_Value.Get_Kind (Tv)) then
                    case Dynamic_Value.Get_Kind (Sv) is
                        when Integer_Number =>
                            I := Dynamic_Value.Get_Value (Sv);
                            Dynamic_Value.Set_Value (Tv, I);
                        when String_Of_Characters =>
                            S := Unlimited_String.Value
                                    (Dynamic_Value.Get_Value (Sv));
                            Dynamic_Value.Set_Value
                               (Tv, Unlimited_String.Image (S));
                        when others =>
                            null;  
                    end case;  
                else
                    raise Bad_Argument_Type;
                end if;

            when Append_In_Set_Of_Word =>
                Dynamic_Node.Evaluate (The_Action.The_Word);
                Dynamic_Node.Evaluate (The_Action.The_Target_Set);
                Sv := Dynamic_Node.Get_Value (The_Action.The_Word);
                Tv := Dynamic_Node.Get_Value (The_Action.The_Target_Set);
                if ((Dynamic_Value.Get_Kind (Sv) =
                     Dynamic_Value.Vocabulary_Word) and
                    (Dynamic_Value.Get_Kind (Tv) =
                     Dynamic_Value.Set_Of_Words)) then
                    Dynamic_Value.Append_To_Set (Tv,
                                                 Dynamic_Value.Get_Value (Sv));
                    Dynamic_Node.Set_Value (The_Action.The_Target_Set, Tv);
                else
                    raise Bad_Argument_Type;
                end if;

            when Remove_From_Set_Of_Word =>
                Dynamic_Node.Evaluate (The_Action.The_Out_Word);
                Dynamic_Node.Evaluate (The_Action.The_Reduced_Set);
                Sv := Dynamic_Node.Get_Value (The_Action.The_Out_Word);
                Tv := Dynamic_Node.Get_Value (The_Action.The_Reduced_Set);
                if ((Dynamic_Value.Get_Kind (Sv) =
                     Dynamic_Value.Vocabulary_Word) and
                    (Dynamic_Value.Get_Kind (Tv) =
                     Dynamic_Value.Set_Of_Words)) then
                    Dynamic_Value.Delete_From_Set
                       (Tv, Dynamic_Value.Get_Value (Sv));
                    Dynamic_Node.Set_Value (The_Action.The_Reduced_Set, Tv);
                else
                    raise Bad_Argument_Type;
                end if;

            when Clear_Set_Of_Word =>
                Dynamic_Node.Evaluate (The_Action.The_Set);  
                Tv := Dynamic_Node.Get_Value (The_Action.The_Set);  
                Dynamic_Value.Purge_Set (Tv);
                Dynamic_Node.Set_Value (The_Action.The_Set, Tv);

            when Quit_Action =>
                raise End_Of_Program;

            when others =>
                null;
        end case;
    end Execute_Action;


    procedure Add_Action (In_List : in out Acces_List;
                          The_Action : in Object) is
    begin
        Action_List.Add (In_List.all, The_Action);
    end Add_Action;


    procedure Evaluate (The_List : Acces_List) is
        It : Action_List.Iterator;
    begin
        if (The_List /= null) then
            Action_List.Init (It, The_List.all);  
            while not Action_List.Done (It) loop
                Evaluate_Action (Action_List.Value (It));
                Action_List.Next (It);
            end loop;
        end if;
    end Evaluate;


    procedure Execute (The_List : Acces_List) is
        It : Action_List.Iterator;
    begin
        if (The_List /= null) then  
            Action_List.Init (It, The_List.all);
            while not Action_List.Done (It) loop
                Execute_Action (Action_List.Value (It));
                Action_List.Next (It);
            end loop;
        end if;  
    end Execute;


end Compiler_Action;

E3 Meta Data

    nblk1=1f
    nid=1e
    hdr6=30
        [0x00] rec0=19 rec1=00 rec2=01 rec3=042
        [0x01] rec0=19 rec1=00 rec2=0c rec3=046
        [0x02] rec0=12 rec1=00 rec2=0f rec3=036
        [0x03] rec0=11 rec1=00 rec2=09 rec3=03c
        [0x04] rec0=1c rec1=00 rec2=13 rec3=01a
        [0x05] rec0=15 rec1=00 rec2=12 rec3=02e
        [0x06] rec0=01 rec1=00 rec2=1b rec3=078
        [0x07] rec0=14 rec1=00 rec2=0a rec3=054
        [0x08] rec0=14 rec1=00 rec2=04 rec3=03a
        [0x09] rec0=18 rec1=00 rec2=19 rec3=038
        [0x0a] rec0=19 rec1=00 rec2=15 rec3=004
        [0x0b] rec0=18 rec1=00 rec2=07 rec3=006
        [0x0c] rec0=1a rec1=00 rec2=06 rec3=060
        [0x0d] rec0=16 rec1=00 rec2=18 rec3=044
        [0x0e] rec0=21 rec1=00 rec2=05 rec3=010
        [0x0f] rec0=17 rec1=00 rec2=0d rec3=01a
        [0x10] rec0=1c rec1=00 rec2=0b rec3=048
        [0x11] rec0=1a rec1=00 rec2=1a rec3=078
        [0x12] rec0=11 rec1=00 rec2=17 rec3=042
        [0x13] rec0=15 rec1=00 rec2=08 rec3=03c
        [0x14] rec0=14 rec1=00 rec2=1c rec3=056
        [0x15] rec0=12 rec1=00 rec2=14 rec3=098
        [0x16] rec0=20 rec1=00 rec2=03 rec3=05e
        [0x17] rec0=16 rec1=00 rec2=02 rec3=000
        [0x18] rec0=14 rec1=00 rec2=1c rec3=048
        [0x19] rec0=0d rec1=00 rec2=11 rec3=012
        [0x1a] rec0=13 rec1=00 rec2=03 rec3=006
        [0x1b] rec0=1e rec1=00 rec2=1b rec3=030
        [0x1c] rec0=09 rec1=00 rec2=02 rec3=000
        [0x1d] rec0=04 rec1=00 rec2=14 rec3=000
        [0x1e] rec0=00 rec1=10 rec2=00 rec3=000
    tail 0x21545f788865a5a5f69c2 0x42a00088462060003
Free Block Chain:
  0x1e: 0000  00 16 00 0c 80 09 74 20 28 54 68 65 5f 41 72 09  ┆      t (The_Ar ┆
  0x16: 0000  00 0e 03 fc 80 1d 74 69 6f 6e 20 28 54 68 65 5f  ┆      tion (The_┆
  0xe: 0000  00 1d 00 08 80 05 20 20 20 20 20 05 06 07 08 09  ┆                ┆
  0x1d: 0000  00 11 00 0f 80 0c 5f 4e 6f 64 65 27 28 57 68 61  ┆      _Node'(Wha┆
  0x11: 0000  00 10 02 79 80 25 65 74 5f 56 61 6c 75 65 20 28  ┆   y %et_Value (┆
  0x10: 0000  00 1f 02 e2 80 0a 4f 66 5f 57 6f 72 64 20 3d 3e  ┆      Of_Word =>┆
  0x1f: 0000  00 00 00 04 80 01 65 01 02 03 40 40 40 40 40 40  ┆      e   @@@@@@┆