final public TypeTag TypeTag(Recovery next) throws ParseException {
    Token lsquare;
    Token sort;
    Token number;
    Token rsquare;
    Token kind;
    TypeTag typeTag = new TypeTag();
    next.push(DEC_NUMBER_T);
    next.push(RIGHT_SQUARE_T);
    next.push(EXPLICIT_T);
    next.push(IMPLICIT_T);
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case LEFT_SQUARE_T:
      lsquare = jj_consume_token(LEFT_SQUARE_T);
      try {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case APPLICATION_T:
          sort = jj_consume_token(APPLICATION_T);
          break;
        case UNIVERSAL_T:
          sort = jj_consume_token(UNIVERSAL_T);
          break;
        case PRIVATE_T:
          sort = jj_consume_token(PRIVATE_T);
          break;
        default:
          jj_la1[13] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
              typeTag.setSort(makeNodeToken(sort));
      } catch (ParseException e) {
            handleError(e, next,
                                        "tag sort <APPLICATION/UNIVERSAL/PRIVATE>");
      } finally {
            next.pop(); /* DEC_NUMBER_T */

      }
      try {
        number = jj_consume_token(DEC_NUMBER_T);
              typeTag.setNumber(new NumericValue(makeNodeToken(number)));
      } catch (ParseException e) {
            handleError(e, next, "<decimal tag number>");
      } finally {
            next.pop(); /* RIGHT_SQUARE_T */

      }
      rsquare = jj_consume_token(RIGHT_SQUARE_T);
            next.pop(2); /* EXPLICIT_T, IMPLICIT_T */

      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EXPLICIT_T:
      case IMPLICIT_T:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case EXPLICIT_T:
          kind = jj_consume_token(EXPLICIT_T);
          break;
        case IMPLICIT_T:
          kind = jj_consume_token(IMPLICIT_T);
          break;
        default:
          jj_la1[14] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
              typeTag.setKind(makeNodeToken(kind));
        break;
      default:
        jj_la1[15] = jj_gen;
        ;
      }
      break;
    default:
      jj_la1[16] = jj_gen;
      ;
    }
      {if (true) return typeTag;}
    throw new Error("Missing return statement in function");
  }