final public void subprogram_specification() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case PROCEDURE:
      jj_consume_token(PROCEDURE);
      identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 152:
        jj_consume_token(152);
        interface_list(null);
        jj_consume_token(153);
        break;
      default:
        jj_la1[190] = jj_gen;
        ;
      }
      break;
    case FUNCTION:
    case IMPURE:
    case PURE:
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case IMPURE:
      case PURE:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case PURE:
          jj_consume_token(PURE);
          break;
        case IMPURE:
          jj_consume_token(IMPURE);
          break;
        default:
          jj_la1[191] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        break;
      default:
        jj_la1[192] = jj_gen;
        ;
      }
      jj_consume_token(FUNCTION);
      identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 152:
        jj_consume_token(152);
        interface_list(null);
        jj_consume_token(153);
        break;
      default:
        jj_la1[193] = jj_gen;
        ;
      }
      jj_consume_token(RETURN);
      name();
      break;
    default:
      jj_la1[194] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }