public final AntlrPilarParser.transformation_return transformation()
      throws RecognitionException {
    AntlrPilarParser.transformation_return retval = new AntlrPilarParser.transformation_return();
    retval.start = input.LT(1);
    int transformation_StartIndex = input.index();
    Object root_0 = null;

    AntlrPilarParser.parenGroupedAnnotationList_return parenGroupedAnnotationList226 = null;

    AntlrPilarParser.guard_return guard227 = null;

    AntlrPilarParser.seqTransformation_return seqTransformation228 = null;

    RewriteRuleSubtreeStream stream_parenGroupedAnnotationList = new RewriteRuleSubtreeStream(
        adaptor, "rule parenGroupedAnnotationList");
    RewriteRuleSubtreeStream stream_guard = new RewriteRuleSubtreeStream(
        adaptor, "rule guard");
    RewriteRuleSubtreeStream stream_seqTransformation = new RewriteRuleSubtreeStream(
        adaptor, "rule seqTransformation");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 59)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:470:2: ( parenGroupedAnnotationList ( guard )? seqTransformation -> ^( TRANSFORMATION parenGroupedAnnotationList ^( OPTION ( guard )? ) seqTransformation ) )
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:470:4: parenGroupedAnnotationList ( guard )? seqTransformation
      {
        pushFollow(FOLLOW_parenGroupedAnnotationList_in_transformation4231);
        parenGroupedAnnotationList226 = parenGroupedAnnotationList();

        state._fsp--;
        if (state.failed) return retval;
        if (state.backtracking == 0)
          stream_parenGroupedAnnotationList.add(parenGroupedAnnotationList226
              .getTree());
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:470:31: ( guard )?
        int alt74 = 2;
        alt74 = dfa74.predict(input);
        switch (alt74) {
          case 1:
          // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: guard
          {
            pushFollow(FOLLOW_guard_in_transformation4233);
            guard227 = guard();

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

          }
            break;

        }

        pushFollow(FOLLOW_seqTransformation_in_transformation4240);
        seqTransformation228 = seqTransformation();

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

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

              adaptor.addChild(
                  root_1,
                  stream_parenGroupedAnnotationList.nextTree());
              // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:471:88: ^( OPTION ( guard )? )
              {
                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:471:97: ( guard )?
                if (stream_guard.hasNext()) {
                  adaptor.addChild(root_2, stream_guard.nextTree());

                }
                stream_guard.reset();

                adaptor.addChild(root_1, root_2);
              }
              adaptor.addChild(root_1, stream_seqTransformation.nextTree());

              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, 59, transformation_StartIndex);
      }
    }
    return retval;
  }