public Class analyze() {
    cursor = start;
    resolvedExternally = true;
    if (ctx == null) {
      ctx = Object.class;
      first = true;
    }

    while (cursor < end) {
      classLiteral = false;
      switch (nextSubToken()) {
        case NORM:
          ctx = getBeanProperty(ctx, capture());
          break;
        case METH:
          ctx = getMethod(ctx, capture());
          break;
        case COL:
          ctx = getCollectionProperty(ctx, capture());
          break;
        case WITH:
          ctx = getWithProperty(ctx);
          break;

        case DONE:
          break;
      }
      if (cursor < length && !first) deepProperty = true;

      first = false;
    }
    return ctx;
  }