public final AntlrPilarParser.localVarDeclaration_return localVarDeclaration()
      throws RecognitionException {
    AntlrPilarParser.localVarDeclaration_return retval = new AntlrPilarParser.localVarDeclaration_return();
    retval.start = input.LT(1);
    int localVarDeclaration_StartIndex = input.index();
    Object root_0 = null;

    Token char_literal218 = null;
    Token char_literal220 = null;
    AntlrPilarParser.type_return type216 = null;

    AntlrPilarParser.localVarFragment_return localVarFragment217 = null;

    AntlrPilarParser.localVarFragment_return localVarFragment219 = null;

    Object char_literal218_tree = null;
    Object char_literal220_tree = null;
    RewriteRuleTokenStream stream_175 = new RewriteRuleTokenStream(adaptor,
        "token 175");
    RewriteRuleTokenStream stream_172 = new RewriteRuleTokenStream(adaptor,
        "token 172");
    RewriteRuleSubtreeStream stream_localVarFragment = new RewriteRuleSubtreeStream(
        adaptor, "rule localVarFragment");
    RewriteRuleSubtreeStream stream_type = new RewriteRuleSubtreeStream(
        adaptor, "rule type");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 56)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:454:2: ( ( type )? localVarFragment ( ',' localVarFragment )* ';' -> ^( LOCAL ^( OPTION ( type )? ) ^( LIST ( localVarFragment )+ ) ) )
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:454:4: ( type )? localVarFragment ( ',' localVarFragment )* ';'
      {
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:454:4: ( type )?
        int alt70 = 2;
        int LA70_0 = input.LA(1);

        if ((LA70_0 == TYPEVARID || LA70_0 == 169 || LA70_0 == 177)) {
          alt70 = 1;
        } else if ((LA70_0 == ID)) {
          int LA70_2 = input.LA(2);

          if ((LA70_2 == ID || LA70_2 == 167 || LA70_2 == 177 || LA70_2 == 202
              || (LA70_2 >= 215 && LA70_2 <= 216) || LA70_2 == 225)) {
            alt70 = 1;
          }
        }
        switch (alt70) {
          case 1:
          // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: type
          {
            pushFollow(FOLLOW_type_in_localVarDeclaration4014);
            type216 = type();

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

          }
            break;

        }

        pushFollow(FOLLOW_localVarFragment_in_localVarDeclaration4017);
        localVarFragment217 = localVarFragment();

        state._fsp--;
        if (state.failed) return retval;
        if (state.backtracking == 0)
          stream_localVarFragment.add(localVarFragment217.getTree());
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:455:4: ( ',' localVarFragment )*
        loop71: do {
          int alt71 = 2;
          int LA71_0 = input.LA(1);

          if ((LA71_0 == 172)) {
            alt71 = 1;
          }

          switch (alt71) {
            case 1:
            // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:455:6: ',' localVarFragment
            {
              char_literal218 = (Token) match(
                  input,
                  172,
                  FOLLOW_172_in_localVarDeclaration4025);
              if (state.failed) return retval;
              if (state.backtracking == 0) stream_172.add(char_literal218);

              pushFollow(FOLLOW_localVarFragment_in_localVarDeclaration4027);
              localVarFragment219 = localVarFragment();

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

            }
              break;

            default:
              break loop71;
          }
        } while (true);

        char_literal220 = (Token) match(
            input,
            175,
            FOLLOW_175_in_localVarDeclaration4032);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_175.add(char_literal220);

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

              // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:455:52: ^( OPTION ( type )? )
              {
                Object root_2 = (Object) adaptor.nil();
                root_2 = (Object) adaptor.becomeRoot(
                    (Object) adaptor.create(OPTION, "OPTION"),
                    root_2);

                // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:455:61: ( type )?
                if (stream_type.hasNext()) {
                  adaptor.addChild(root_2, stream_type.nextTree());

                }
                stream_type.reset();

                adaptor.addChild(root_1, root_2);
              }
              // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:455:68: ^( LIST ( localVarFragment )+ )
              {
                Object root_2 = (Object) adaptor.nil();
                root_2 = (Object) adaptor.becomeRoot(
                    (Object) adaptor.create(LIST, "LIST"),
                    root_2);

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

                }
                stream_localVarFragment.reset();

                adaptor.addChild(root_1, root_2);
              }

              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, 56, localVarDeclaration_StartIndex);
      }
    }
    return retval;
  }