code: public Number doParse(String text, ParsePosition parsePosition, double baseValue,
                          double upperBound, boolean lenientParse) {
          // if this isn't a >>> substitution, we can just use the
          // inherited parse() routine to do the parsing
          if (ruleToUse == null) {
              return super.doParse(text, parsePosition, baseValue, upperBound, lenientParse);
  
          } else {
              // but if it IS a >>> substitution, we have to do it here: we
              // use the specific rule's doParse() method, and then we have to
              // do some of the other work of NFRuleSet.parse()
              Number tempResult = ruleToUse.doParse(text, parsePosition, false, upperBound);
  
              if (parsePosition.getIndex() != 0) {
                  double result = tempResult.doubleValue();
  
                  result = composeRuleValue(result, baseValue);
                  if (result == (long)result) {
                      return Long.valueOf((long)result);
                  } else {
                      return new Double(result);
                  }
              } else {
                  return tempResult;
              }
          }
      }
docs: If this is a &gt;&gt;&gt; substitution, match only against ruleToUse.
  Otherwise, use the superclass function.
  @param text The string to parse
  @param parsePosition Ignored on entry, updated on exit to point to
  the first unmatched character.
  @param baseValue The partial parse result prior to calling this
  routine.