public final AntlrPilarParser.localVarsDeclaration_return localVarsDeclaration()
      throws RecognitionException {
    AntlrPilarParser.localVarsDeclaration_return retval = new AntlrPilarParser.localVarsDeclaration_return();
    retval.start = input.LT(1);
    int localVarsDeclaration_StartIndex = input.index();
    Object root_0 = null;

    Token t = null;
    AntlrPilarParser.localVarDeclaration_return localVarDeclaration215 = null;

    Object t_tree = null;
    RewriteRuleTokenStream stream_193 = new RewriteRuleTokenStream(adaptor,
        "token 193");
    RewriteRuleSubtreeStream stream_localVarDeclaration = new RewriteRuleSubtreeStream(
        adaptor, "rule localVarDeclaration");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 55)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:450:2: ( (t= 'local' )? ( localVarDeclaration )+ -> ^( LIST ( localVarDeclaration )+ ) )
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:450:4: (t= 'local' )? ( localVarDeclaration )+
      {
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:450:5: (t= 'local' )?
        int alt68 = 2;
        int LA68_0 = input.LA(1);

        if ((LA68_0 == 193)) {
          alt68 = 1;
        }
        switch (alt68) {
          case 1:
          // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: t= 'local'
          {
            t = (Token) match(
                input,
                193,
                FOLLOW_193_in_localVarsDeclaration3985);
            if (state.failed) return retval;
            if (state.backtracking == 0) stream_193.add(t);

          }
            break;

        }

        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:450:15: ( localVarDeclaration )+
        int cnt69 = 0;
        loop69: do {
          int alt69 = 2;
          int LA69_0 = input.LA(1);

          if (((LA69_0 >= ID && LA69_0 <= TYPEVARID) || LA69_0 == 169 || LA69_0 == 177)) {
            alt69 = 1;
          }

          switch (alt69) {
            case 1:
            // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: localVarDeclaration
            {
              pushFollow(FOLLOW_localVarDeclaration_in_localVarsDeclaration3988);
              localVarDeclaration215 = localVarDeclaration();

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

            }
              break;

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

        // AST REWRITE
        // elements: localVarDeclaration
        // 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();
          // 450:41: -> ^( LIST ( localVarDeclaration )+ )
          {
            // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:450:44: ^( LIST ( localVarDeclaration )+ )
            {
              Object root_1 = (Object) adaptor.nil();
              root_1 = (Object) adaptor.becomeRoot(
                  (Object) adaptor.create(LIST, "LIST"),
                  root_1);

              if (!(stream_localVarDeclaration.hasNext())) {
                throw new RewriteEarlyExitException();
              }
              while (stream_localVarDeclaration.hasNext()) {
                adaptor.addChild(root_1, stream_localVarDeclaration.nextTree());

              }
              stream_localVarDeclaration.reset();

              adaptor.addChild(root_0, root_1);
            }

          }

          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, 55, localVarsDeclaration_StartIndex);
      }
    }
    return retval;
  }