public final AntlrPilarParser.typeExtensionMember_return typeExtensionMember()
      throws RecognitionException {
    AntlrPilarParser.typeExtensionMember_return retval = new AntlrPilarParser.typeExtensionMember_return();
    retval.start = input.LT(1);
    int typeExtensionMember_StartIndex = input.index();
    Object root_0 = null;

    AntlrPilarParser.typeExtensionAttributeBinding_return typeExtensionAttributeBinding169 = null;

    AntlrPilarParser.actionExtension_return actionExtension170 = null;

    AntlrPilarParser.expExtension_return expExtension171 = null;

    AntlrPilarParser.procExtension_return procExtension172 = null;

    try {
      if (state.backtracking > 0 && alreadyParsedRule(input, 46)) {
        return retval;
      }
      // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:399:2: ( typeExtensionAttributeBinding | actionExtension | expExtension | procExtension )
      int alt49 = 4;
      switch (input.LA(1)) {
        case ID: {
          alt49 = 1;
        }
          break;
        case 190: {
          alt49 = 2;
        }
          break;
        case 191: {
          alt49 = 3;
        }
          break;
        case 192: {
          alt49 = 4;
        }
          break;
        default:
          if (state.backtracking > 0) {
            state.failed = true;
            return retval;
          }
          NoViableAltException nvae = new NoViableAltException("", 49, 0, input);

          throw nvae;
      }

      switch (alt49) {
        case 1:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:399:4: typeExtensionAttributeBinding
        {
          root_0 = (Object) adaptor.nil();

          pushFollow(FOLLOW_typeExtensionAttributeBinding_in_typeExtensionMember3346);
          typeExtensionAttributeBinding169 = typeExtensionAttributeBinding();

          state._fsp--;
          if (state.failed) return retval;
          if (state.backtracking == 0)
            adaptor
                .addChild(root_0, typeExtensionAttributeBinding169.getTree());

        }
          break;
        case 2:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:400:4: actionExtension
        {
          root_0 = (Object) adaptor.nil();

          pushFollow(FOLLOW_actionExtension_in_typeExtensionMember3351);
          actionExtension170 = actionExtension();

          state._fsp--;
          if (state.failed) return retval;
          if (state.backtracking == 0)
            adaptor.addChild(root_0, actionExtension170.getTree());

        }
          break;
        case 3:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:401:4: expExtension
        {
          root_0 = (Object) adaptor.nil();

          pushFollow(FOLLOW_expExtension_in_typeExtensionMember3356);
          expExtension171 = expExtension();

          state._fsp--;
          if (state.failed) return retval;
          if (state.backtracking == 0)
            adaptor.addChild(root_0, expExtension171.getTree());

        }
          break;
        case 4:
        // /Users/robby/Repositories/sireum-parser/sireum-parser/src/main/java/org/sireum/pilar/parser/AntlrPilar.g:402:4: procExtension
        {
          root_0 = (Object) adaptor.nil();

          pushFollow(FOLLOW_procExtension_in_typeExtensionMember3361);
          procExtension172 = procExtension();

          state._fsp--;
          if (state.failed) return retval;
          if (state.backtracking == 0)
            adaptor.addChild(root_0, procExtension172.getTree());

        }
          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, 46, typeExtensionMember_StartIndex);
      }
    }
    return retval;
  }