public static Cons decomposeDateTimeString(String string, int start, int end) {
    { int stringIndex = start;
      boolean nextNegativeP = false;
      boolean parsingTimeP = false;
      Cons partsList = Stella.NIL;
      char nextChar = Stella.NULL_CHARACTER;
      char prevChar = Stella.NULL_CHARACTER;

      if (end == Stella.NULL_INTEGER) {
        end = string.length();
      }
      while (stringIndex < end) {
        nextChar = string.charAt(stringIndex);
        prevChar = ((stringIndex == start) ? Stella.NULL_CHARACTER : string.charAt((stringIndex - 1)));
        if (Stella.$CHARACTER_TYPE_TABLE$[(int) nextChar] == Stella.KWD_LETTER) {
          parsingTimeP = false;
          { int scanIndex = Stella.NULL_INTEGER;
            int iter000 = stringIndex + 1;

            loop001 : for (;true; iter000 = iter000 + 1) {
              scanIndex = iter000;
              if ((scanIndex == end) ||
                  (!(Stella.$CHARACTER_TYPE_TABLE$[(int) (string.charAt(scanIndex))] == Stella.KWD_LETTER))) {
                { Cons matchSymbol = Stella.matchSubstring(Native.string_subsequence(string, stringIndex, scanIndex), parsingTimeP);

                  if (matchSymbol == Stella.NIL) {
                    return (Stella.NIL);
                  }
                  else {
                    partsList = Cons.cons(matchSymbol, partsList);
                  }
                }
                stringIndex = scanIndex;
                break loop001;
              }
            }
          }
        }
        else if (Stella.$CHARACTER_TYPE_TABLE$[(int) nextChar] == Stella.KWD_DIGIT) {
          { int numericValue = Stella.digitValue(nextChar);
            int fractionalValue = 0;
            double fractionalDivisor = 1.0;
            boolean inFractionP = false;

            { int scanIndex = Stella.NULL_INTEGER;
              int iter001 = stringIndex + 1;

              loop002 : for (;true; iter001 = iter001 + 1) {
                scanIndex = iter001;
                if ((scanIndex == end) ||
                    (!((Stella.$CHARACTER_TYPE_TABLE$[(int) (string.charAt(scanIndex))] == Stella.KWD_DIGIT) ||
                    ((!inFractionP) &&
                     (string.charAt(scanIndex) == '.'))))) {
                  if (nextNegativeP) {
                    nextNegativeP = false;
                    numericValue = 0 - numericValue;
                    fractionalValue = 0 - fractionalValue;
                  }
                  if (inFractionP) {
                    partsList = Cons.cons(FloatWrapper.wrapFloat(numericValue + (fractionalValue / fractionalDivisor)), partsList);
                  }
                  else {
                    partsList = Cons.cons(IntegerWrapper.wrapInteger(numericValue), partsList);
                  }
                  stringIndex = scanIndex;
                  break loop002;
                }
                if (inFractionP) {
                  fractionalValue = (fractionalValue * 10) + Stella.digitValue(string.charAt(scanIndex));
                  fractionalDivisor = fractionalDivisor * 10.0;
                }
                else if (string.charAt(scanIndex) == '.') {
                  inFractionP = true;
                }
                else {
                  numericValue = (numericValue * 10) + Stella.digitValue(string.charAt(scanIndex));
                }
              }
            }
          }
        }
        else if ((nextChar == '-') &&
            ((prevChar == Stella.NULL_CHARACTER) ||
             (Stella.WHITESPACE_CHARS.memberP(CharacterWrapper.wrapCharacter(prevChar)) ||
              (Stella.DATE_DIVIDERS.memberP(CharacterWrapper.wrapCharacter(prevChar)) ||
               (parsingTimeP &&
                (Stella.$CHARACTER_TYPE_TABLE$[(int) prevChar] == Stella.KWD_DIGIT)))))) {
          nextNegativeP = true;
          stringIndex = stringIndex + 1;
        }
        else if (Stella.TIME_DIVIDERS.memberP(CharacterWrapper.wrapCharacter(nextChar))) {
          partsList = Cons.cons(Cons.consList(Cons.cons(Stella.SYM_STELLA_TIME_DIVIDER, Cons.cons(CharacterWrapper.wrapCharacter(nextChar), Stella.NIL))), partsList);
          parsingTimeP = true;
          stringIndex = stringIndex + 1;
        }
        else if (Stella.DATE_DIVIDERS.memberP(CharacterWrapper.wrapCharacter(nextChar))) {
          partsList = Cons.cons(Cons.consList(Cons.cons(Stella.SYM_STELLA_DATE_DIVIDER, Cons.cons(CharacterWrapper.wrapCharacter(nextChar), Stella.NIL))), partsList);
          parsingTimeP = false;
          stringIndex = stringIndex + 1;
        }
        else if (Stella.DATE_TIME_DIVIDERS.memberP(CharacterWrapper.wrapCharacter(nextChar))) {
          partsList = Cons.cons(Cons.consList(Cons.cons(Stella.SYM_STELLA_DATE_TIME_DIVIDER, Cons.cons(CharacterWrapper.wrapCharacter(nextChar), Stella.NIL))), partsList);
          parsingTimeP = true;
          stringIndex = stringIndex + 1;
        }
        else if (Stella.WHITESPACE_CHARS.memberP(CharacterWrapper.wrapCharacter(nextChar))) {
          parsingTimeP = false;
          stringIndex = stringIndex + 1;
        }
        else if (nextChar == '+') {
          partsList = Cons.cons(Cons.consList(Cons.cons(Stella.SYM_STELLA_DATE_DIVIDER, Cons.cons(CharacterWrapper.wrapCharacter(nextChar), Stella.NIL))), partsList);
          stringIndex = stringIndex + 1;
        }
        else if (nextChar == '(') {
          while ((!(stringIndex == end)) &&
              (!(string.charAt(stringIndex) == ')'))) {
            parsingTimeP = false;
            stringIndex = stringIndex + 1;
          }
        }
        else {
          if (((Boolean)(Stella.$ERROR_ON_MISMATCH$.get())).booleanValue()) {
            { OutputStringStream stream000 = OutputStringStream.newOutputStringStream();

              stream000.nativeStream.print(">>> Bogus character at position `" + stringIndex + "' in \"`" + string + "'\"");
              throw ((StellaException)(StellaException.newStellaException(stream000.theStringReader()).fillInStackTrace()));
            }
          }
          else {
            return (Stella.NIL);
          }
        }
      }
      return (partsList.reverse());
    }
  }