separate (Compilation_Unit.Produce_Metrics)
procedure Task_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

    --=========================================
    -- Task_Unit ::=
    --   $ 2nd token = "BODY" $
    --     1. Task_Body
    --     2. Task_Specification
    --=========================================

begin
    -- Task_Unit

    -- check if second token is "BODY"
    if Token_Package.Value_Of
          (Peek (From => Current_Compilation_Unit, Offset => 2)) =
       Token_Package.Body_Token then

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

    else

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

    end if;

end Task_Unit;