with Dyn;
package Halstead_Operator is

    --=================================================================
    -- This package contains the definition of Halstead operator and ==
    -- one operation used to compare objects of type Definition.     ==
    --=================================================================

    type Operator_Kind is
       (
        -- Basic Operators
        And_Then_Halstead, Or_Else_Halstead,
        Equal_Halstead,                      -- =
        Inequality_Halstead,                 -- /=
        Less_Than_Halstead,                  -- <
        Less_Than_Or_Equal_Halstead,         -- <=
        Greater_Than_Halstead,               -- >
        Greater_Than_Or_Equal_Halstead,      -- >=
        In_Out_Halstead, Plus_Halstead,                       -- +
        Minus_Halstead,                      -- -
        Concatenate_Halstead,                -- &
        Star_Halstead,                       -- *
        Divide_Halstead,                     -- /
        Double_Star_Halstead,                -- **
        Assignment_Halstead,                 -- :=
        Arrow_Halstead,                      -- =>
        Vertical_Bar_Halstead,               -- |
        Dot_Halstead,                        -- .
        Colon_Halstead,                      -- :
        Exclamation_Mark_Halstead,           -- !
        Box_Halstead,                        -- <>
        Double_Dot_Halstead,                 -- ..
        Tick_Halstead,                       -- '

        -- Grouping Operators and Delimiters
        Parentheses_Halstead,                -- (...)
        Apostrophes_Halstead,                -- '..'
        Quotes_Halstead,                     -- "..."
        Percents_Halstead,                   -- %...%
        Label_Halstead,                      -- <<...>>

        -- Terminator and Separator
        Semicolon_Halstead,                  -- ;
        Comma_Halstead,                      -- ,

        -- Keyword Operators
        Abort_Halstead, Abs_Halstead, Accept_Halstead, Accept_Do_End_Halstead,
        Access_Halstead, All_Halstead, And_Halstead, Array_Of_Halstead,
        At_Halstead, At_Mod_Halstead, Begin_End_Halstead,
        Case_Is_End_Case_Halstead, Constant_Halstead, Declare_Halstead,
        Delay_Halstead, Delta_Halstead, Digits_Halstead,
        Else_Halstead, Elsif_Then_Halstead, Entry_Halstead,
        Exception_Halstead,           -- in begin ... end
        Exit_Halstead, For_In_Halstead,              -- in for loop
        For_Use_Halstead,             -- in rep. specs.
        Function_Halstead, Function_Is_Halstead, Generic_Halstead,
        Goto_Halstead, If_Then_End_If_Halstead, In_Halstead, Is_New_Halstead,
        Limited_Private_Halstead, Loop_End_Loop_Halstead, Mod_Halstead,
        New_Halstead, Not_Halstead, Null_Halstead, Or_Halstead, Others_Halstead,
        Out_Halstead, Package_Halstead, Package_Is_End_Halstead,
        Package_Body_Is_Halstead, Package_Body_Is_End_Halstead, Pragma_Halstead,
        Private_Halstead, Procedure_Halstead, Procedure_Is_Halstead,
        Raise_Halstead, Range_Halstead, Record_End_Record_Halstead,
        Rem_Halstead, Renames_Halstead, Return_Halstead, Reverse_Halstead,
        Select_End_Select_Halstead, Separate_Halstead, Subtype_Is_Halstead,
        Task_Halstead, Task_Is_End_Halstead, Task_Body_Is_Halstead,
        Terminate_Halstead, Type_Halstead, Type_Is_Halstead, Use_Halstead,
        When_Halstead, While_Halstead, With_Halstead, Xor_Halstead,

        -- others
        Literal);

    type Definition (Kind : Operator_Kind := Literal) is
        record
            case Kind is
                when Literal =>
                    Value : Dyn.Dyn_String;
                when others =>
                    null;
            end case;
        end record;

    function Is_Equal
                (Left : in Definition; Right : in Definition) return Boolean;
    -- compares two operators; returns TRUE if Left is equal to
    -- Right, otherwise FALSE.

    function "<" (Left : in Definition; Right : in Definition) return Boolean;
    -- compares two operators; returns TRUE if Left is less than
    -- Right, otherwise FALSE.

    function Convert (This_String : in String) return Definition;
    -- converts string to operator.

end Halstead_Operator;