public final AntlrPilarParser.parenGroupedAnnotationList_return parenGroupedAnnotationList()
      throws RecognitionException {
    AntlrPilarParser.parenGroupedAnnotationList_return retval = new AntlrPilarParser.parenGroupedAnnotationList_return();
    retval.start = input.LT(1);
    int parenGroupedAnnotationList_StartIndex = input.index();
    Object root_0 = null;

    Token char_literal29 = null;
    Token char_literal31 = null;
    AntlrPilarParser.annotation_return annotation30 = null;

    Object char_literal29_tree = null;
    Object char_literal31_tree = null;
    RewriteRuleTokenStream stream_170 = new RewriteRuleTokenStream(adaptor,
        "token 170");
    RewriteRuleTokenStream stream_169 = new RewriteRuleTokenStream(adaptor,
        "token 169");
    RewriteRuleSubtreeStream stream_annotation = new RewriteRuleSubtreeStream(
        adaptor, "rule annotation");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 14)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:223:2: ( -> ^( LIST ) | '(' ( annotation )+ ')' -> ^( LIST ( annotation )+ ) )
      int alt8 = 2;
      int LA8_0 = input.LA(1);

      if ((LA8_0 == EOF || (LA8_0 >= HEX_LIT && LA8_0 <= OCT_LIT)
          || LA8_0 == ID || (LA8_0 >= GLOBALID && LA8_0 <= LOCID)
          || (LA8_0 >= ADD_OP && LA8_0 <= RATIONAL_LIT)
          || (LA8_0 >= 177 && LA8_0 <= 178) || LA8_0 == 194
          || (LA8_0 >= 196 && LA8_0 <= 199) || LA8_0 == 201
          || (LA8_0 >= 204 && LA8_0 <= 208) || LA8_0 == 211 || LA8_0 == 215
          || (LA8_0 >= 217 && LA8_0 <= 221) || LA8_0 == 223)) {
        alt8 = 1;
      } else if ((LA8_0 == 169)) {
        int LA8_2 = input.LA(2);

        if (((LA8_2 >= HEX_LIT && LA8_2 <= OCT_LIT)
            || (LA8_2 >= ID && LA8_2 <= GLOBALID)
            || (LA8_2 >= ADD_OP && LA8_2 <= RATIONAL_LIT)
            || (LA8_2 >= 169 && LA8_2 <= 170) || LA8_2 == 177 || LA8_2 == 204
            || LA8_2 == 208 || LA8_2 == 215 || (LA8_2 >= 217 && LA8_2 <= 221) || LA8_2 == 223)) {
          alt8 = 1;
        } else if ((LA8_2 == 171)) {
          alt8 = 2;
        } else {
          if (state.backtracking > 0) {
            state.failed = true;
            return retval;
          }
          NoViableAltException nvae = new NoViableAltException("", 8, 2, input);

          throw nvae;
        }
      } else {
        if (state.backtracking > 0) {
          state.failed = true;
          return retval;
        }
        NoViableAltException nvae = new NoViableAltException("", 8, 0, input);

        throw nvae;
      }
      switch (alt8) {
        case 1:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:223:41: 
        {

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

                adaptor.addChild(root_0, root_1);
              }

            }

            retval.tree = root_0;
          }
        }
          break;
        case 2:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:224:4: '(' ( annotation )+ ')'
        {
          char_literal29 = (Token) match(
              input,
              169,
              FOLLOW_169_in_parenGroupedAnnotationList1403);
          if (state.failed) return retval;
          if (state.backtracking == 0) stream_169.add(char_literal29);

          // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:224:8: ( annotation )+
          int cnt7 = 0;
          loop7: do {
            int alt7 = 2;
            int LA7_0 = input.LA(1);

            if ((LA7_0 == 171)) {
              alt7 = 1;
            }

            switch (alt7) {
              case 1:
              // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:0:0: annotation
              {
                pushFollow(FOLLOW_annotation_in_parenGroupedAnnotationList1405);
                annotation30 = annotation();

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

              }
                break;

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

          char_literal31 = (Token) match(
              input,
              170,
              FOLLOW_170_in_parenGroupedAnnotationList1408);
          if (state.failed) return retval;
          if (state.backtracking == 0) stream_170.add(char_literal31);

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

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

                }
                stream_annotation.reset();

                adaptor.addChild(root_0, root_1);
              }

            }

            retval.tree = root_0;
          }
        }
          break;

      }
      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, 14, parenGroupedAnnotationList_StartIndex);
      }
    }
    return retval;
  }