final public TypeSmi Asn1Types() throws ParseException {
    TypeSmi type;
    Token type_t;
    Restriction restriction;
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case INTEGER_T:
      /* INTEGER type, has an optional range restriction. */
              type_t = jj_consume_token(INTEGER_T);
          type = new TypeSmi(makeNodeToken(type_t));
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LEFT_PAREN_T:
        restriction = RestrictionRange();
              type.addRestriction(restriction);
        break;
      default:
        jj_la1[17] = jj_gen;
        ;
      }
      break;
    case BIT_STRING_T:
      /* BITS types, have an optional name/number list restriction. */
              type_t = jj_consume_token(BIT_STRING_T);
          type = new TypeSmi(makeNodeToken(type_t));
      break;
    case OCTET_STRING_T:
      /* OCTET STRING type, has an optional size restriction. */
              type_t = jj_consume_token(OCTET_STRING_T);
          type = new TypeSmi(makeNodeToken(type_t));
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LEFT_PAREN_T:
        restriction = RestrictionSize(new Recovery(new int[0]));
              type.addRestriction(restriction);
        break;
      default:
        jj_la1[18] = jj_gen;
        ;
      }
      break;
    case OBJECT_IDENTIFIER_T:
      type_t = jj_consume_token(OBJECT_IDENTIFIER_T);
          type = new TypeSmi(makeNodeToken(type_t));
      break;
    default:
      jj_la1[19] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
      {if (true) return type;}
    throw new Error("Missing return statement in function");
  }