public final AntlrPilarParser.globalVarsDeclaration_return globalVarsDeclaration()
      throws RecognitionException {
    AntlrPilarParser.globalVarsDeclaration_return retval = new AntlrPilarParser.globalVarsDeclaration_return();
    retval.start = input.LT(1);
    int globalVarsDeclaration_StartIndex = input.index();
    Object root_0 = null;

    Token string_literal110 = null;
    AntlrPilarParser.globalVarDeclaration_return globalVarDeclaration111 = null;

    Object string_literal110_tree = null;
    RewriteRuleTokenStream stream_183 = new RewriteRuleTokenStream(adaptor,
        "token 183");
    RewriteRuleSubtreeStream stream_globalVarDeclaration = new RewriteRuleSubtreeStream(
        adaptor, "rule globalVarDeclaration");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 33)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:323:2: ( 'global' ( globalVarDeclaration )+ -> ( globalVarDeclaration )+ )
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:323:4: 'global' ( globalVarDeclaration )+
      {
        string_literal110 = (Token) match(
            input,
            183,
            FOLLOW_183_in_globalVarsDeclaration2525);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_183.add(string_literal110);

        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:323:13: ( globalVarDeclaration )+
        int cnt29 = 0;
        loop29: do {
          int alt29 = 2;
          int LA29_0 = input.LA(1);

          if (((LA29_0 >= ID && LA29_0 <= GLOBALID) || LA29_0 == 169 || LA29_0 == 177)) {
            alt29 = 1;
          }

          switch (alt29) {
            case 1:
            // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: globalVarDeclaration
            {
              pushFollow(FOLLOW_globalVarDeclaration_in_globalVarsDeclaration2527);
              globalVarDeclaration111 = globalVarDeclaration();

              state._fsp--;
              if (state.failed) return retval;
              if (state.backtracking == 0)
                stream_globalVarDeclaration.add(globalVarDeclaration111
                    .getTree());

            }
              break;

            default:
              if (cnt29 >= 1) break loop29;
              if (state.backtracking > 0) {
                state.failed = true;
                return retval;
              }
              EarlyExitException eee = new EarlyExitException(29, input);
              throw eee;
          }
          cnt29++;
        } while (true);

        // AST REWRITE
        // elements: globalVarDeclaration
        // token labels: 
        // rule labels: retval
        // token list labels: 
        // rule list labels: 
        // wildcard labels: 
        if (state.backtracking == 0) {
          retval.tree = root_0;
          RewriteRuleSubtreeStream stream_retval = new RewriteRuleSubtreeStream(
              adaptor, "rule retval", retval != null ? retval.tree : null);

          root_0 = (Object) adaptor.nil();
          // 323:41: -> ( globalVarDeclaration )+
          {
            if (!(stream_globalVarDeclaration.hasNext())) {
              throw new RewriteEarlyExitException();
            }
            while (stream_globalVarDeclaration.hasNext()) {
              adaptor.addChild(root_0, stream_globalVarDeclaration.nextTree());

            }
            stream_globalVarDeclaration.reset();

          }

          retval.tree = root_0;
        }
      }

      retval.stop = input.LT(-1);

      if (state.backtracking == 0) {

        retval.tree = (Object) adaptor.rulePostProcessing(root_0);
        adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
      }
    } catch (RecognitionException re) {
      reportError(re);
      recover(input, re);
      retval.tree = (Object) adaptor.errorNode(
          input,
          retval.start,
          input.LT(-1),
          re);

    } finally {
      if (state.backtracking > 0) {
        memoize(input, 33, globalVarsDeclaration_StartIndex);
      }
    }
    return retval;
  }