final public ModuleImport ModuleImport(Recovery next) throws ParseException {
    NodeList symbol_list = new NodeList();
    Identifier symbol;
    Token comma_t;
    Token from_t;
    ModuleIdentifier module_id;
      next.push(FROM_T);
      next.push(COMMA_T);
    try {
      symbol = Symbol();
          symbol_list.addNode(symbol);
    } catch (ParseException e) {
        makeError(e.currentToken, "expected <symbol>");
        recovery(next);
    }
    label_4:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COMMA_T:
        ;
        break;
      default:
        jj_la1[5] = jj_gen;
        break label_4;
      }
      try {
        comma_t = jj_consume_token(COMMA_T);
        symbol = Symbol();
              symbol_list.addNode(symbol);
      } catch (ParseException e) {
            if (e.currentToken.kind == COMMA_T) {
                makeError(e.currentToken, "encountered expected <symbol>");
                recovery(next);
            } else {
                handleError(e, next, "<symbol>");
            }
      }
    }
      symbol_list.nodes.trimToSize();
      next.pop(); /* COMMA_T */
      next.push(TYPE_IDENTIFIER_T);
    try {
      from_t = jj_consume_token(FROM_T);
    } catch (ParseException e) {
        makeError(e.currentToken, "expected 'FROM'");
        recovery(next);
        if (getToken(0).kind == FROM_T) {
            getNextToken();
        }
    } finally {
        next.pop(); /* FROM_T */
        next.pop(); /* TYPE_IDENTIFIER_T */

    }
    module_id = ModuleIdentifier();
      {if (true) return new ModuleImport(symbol_list,
                            module_id);}
    throw new Error("Missing return statement in function");
  }