public final AntlrPilarParser.typeExtensionAttributeBinding_return typeExtensionAttributeBinding()
      throws RecognitionException {
    AntlrPilarParser.typeExtensionAttributeBinding_return retval = new AntlrPilarParser.typeExtensionAttributeBinding_return();
    retval.start = input.LT(1);
    int typeExtensionAttributeBinding_StartIndex = input.index();
    Object root_0 = null;

    Token id1 = null;
    Token id2 = null;
    Token char_literal173 = null;
    Token char_literal175 = null;
    AntlrPilarParser.annotationList_return annotationList174 = null;

    Object id1_tree = null;
    Object id2_tree = null;
    Object char_literal173_tree = null;
    Object char_literal175_tree = null;
    RewriteRuleTokenStream stream_175 = new RewriteRuleTokenStream(adaptor,
        "token 175");
    RewriteRuleTokenStream stream_173 = new RewriteRuleTokenStream(adaptor,
        "token 173");
    RewriteRuleTokenStream stream_ID = new RewriteRuleTokenStream(adaptor,
        "token ID");
    RewriteRuleSubtreeStream stream_annotationList = new RewriteRuleSubtreeStream(
        adaptor, "rule annotationList");
    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 47)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:406:2: (id1= ID '=' id2= ID annotationList ';' -> ^( TYPE_EXT_ATTRIBUTE_BINDING[$id1] $id1 $id2 annotationList ) )
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:406:4: id1= ID '=' id2= ID annotationList ';'
      {
        id1 = (Token) match(
            input,
            ID,
            FOLLOW_ID_in_typeExtensionAttributeBinding3374);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_ID.add(id1);

        char_literal173 = (Token) match(
            input,
            173,
            FOLLOW_173_in_typeExtensionAttributeBinding3376);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_173.add(char_literal173);

        id2 = (Token) match(
            input,
            ID,
            FOLLOW_ID_in_typeExtensionAttributeBinding3380);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_ID.add(id2);

        pushFollow(FOLLOW_annotationList_in_typeExtensionAttributeBinding3385);
        annotationList174 = annotationList();

        state._fsp--;
        if (state.failed) return retval;
        if (state.backtracking == 0)
          stream_annotationList.add(annotationList174.getTree());
        char_literal175 = (Token) match(
            input,
            175,
            FOLLOW_175_in_typeExtensionAttributeBinding3387);
        if (state.failed) return retval;
        if (state.backtracking == 0) stream_175.add(char_literal175);

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

          root_0 = (Object) adaptor.nil();
          // 407:41: -> ^( TYPE_EXT_ATTRIBUTE_BINDING[$id1] $id1 $id2 annotationList )
          {
            // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:407:44: ^( TYPE_EXT_ATTRIBUTE_BINDING[$id1] $id1 $id2 annotationList )
            {
              Object root_1 = (Object) adaptor.nil();
              root_1 = (Object) adaptor.becomeRoot(
                  (Object) adaptor.create(TYPE_EXT_ATTRIBUTE_BINDING, id1),
                  root_1);

              adaptor.addChild(root_1, stream_id1.nextNode());
              adaptor.addChild(root_1, stream_id2.nextNode());
              adaptor.addChild(root_1, stream_annotationList.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, 47, typeExtensionAttributeBinding_StartIndex);
      }
    }
    return retval;
  }