separate (Compilation_Unit.Produce_Metrics)
procedure Package_Unit (Current_Compilation_Unit : in out Ada_Compilation_Unit;
                        Program_Unit : in Program_Unit_State_Machine;
                        Halstead : in Halstead_State_Machine;
                        Loc : in Loc_State_Machine;
                        Mccabe : in Mccabe_State_Machine) is

    --===============================
    -- Package_Unit ::=
    --    $ 2nd token = "BODY" $
    --    1. Package_Body
    --    2. Package_Specification
    --===============================

begin
    -- Package_Unit

    if Token_Package.Value_Of
          (Peek (From => Current_Compilation_Unit, Offset => 2)) =
       Token_Package.Body_Token then

        Package_Body (Current_Compilation_Unit => Current_Compilation_Unit,
                      Program_Unit => Program_Unit,
                      Halstead => Halstead,
                      Loc => Loc,
                      Mccabe => Mccabe);

    else

        -- set program unit kind to PACKAGE_SPECIFICATION
        Program_Unit.Store_Kind_Of_Program_Unit
           (The_Kind_Of_Program_Unit => Package_Specification);

        Package_Specification
           (Current_Compilation_Unit => Current_Compilation_Unit,
            Program_Unit => Program_Unit,
            Halstead => Halstead,
            Loc => Loc,
            Mccabe => Mccabe);

    end if;

end Package_Unit;