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

    --================================================================
    -- Simple_Or_Length_Clause ::=
    --      <IDENTIFIER> Simple_Clause
    --    | Attribute Length_Clause
    --================================================================

    -- contains the kind of name returnded by Name.
    -- The valid values are ATTRIBUTE or SIMPLE_NAME
    Returned_Name_Kind : Name_Kind;

begin
    -- Simple_Or_Length_Clause

    Name (Current_Compilation_Unit => Current_Compilation_Unit,
          Program_Unit => Program_Unit,
          Halstead => Halstead,
          Loc => Loc,
          Mccabe => Mccabe,
          Out_Name_Kind => Returned_Name_Kind);

    case Returned_Name_Kind is

        when Simple_Name =>
            Simple_Clause (Current_Compilation_Unit => Current_Compilation_Unit,
                           Program_Unit => Program_Unit,
                           Halstead => Halstead,
                           Loc => Loc,
                           Mccabe => Mccabe);

        when Attribute =>
            Length_Clause (Current_Compilation_Unit => Current_Compilation_Unit,
                           Program_Unit => Program_Unit,
                           Halstead => Halstead,
                           Loc => Loc,
                           Mccabe => Mccabe);

        when others =>
            raise Syntax_Error;

    end case;

end Simple_Or_Length_Clause;