docs: private BaseDescr lhsAccumulate(PatternContainerDescrBuilder<?, ?> ce) throws RecognitionException {
          PatternDescrBuilder<?> pattern = null;
          BaseDescr result = null;
  
          pattern = helper.start((DescrBuilder<?, ?>) ce,
                  PatternDescrBuilder.class,
                  null);
          if (pattern != null) {
              result = pattern.getDescr();
          }
  
          try {
              if (state.backtracking == 0) {
                  pattern.type("Object");
                  pattern.isQuery(false);
                  // might have to add the implicit bindings as well
              }
  
              AccumulateDescrBuilder<?> accumulate = helper.start(pattern,
                      AccumulateDescrBuilder.class,
                      null);
              try {
                  if (helper.validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE)) {
                      match(input,
                              DRL6Lexer.ID,
                              DroolsSoftKeywords.ACCUMULATE,
                              null,
                              DroolsEditorType.KEYWORD);
                  } else {
                      // might be using the short mnemonic
                      match(input,
                              DRL6Lexer.ID,
                              DroolsSoftKeywords.ACC,
                              null,
                              DroolsEditorType.KEYWORD);
                  }
                  if (state.failed)
                      return null;
  
                  if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
                      helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE);
                  }
                  match(input,
                          DRL6Lexer.LEFT_PAREN,
                          null,
                          null,
                          DroolsEditorType.SYMBOL);
                  if (state.failed)
                      return null;
  
                  CEDescrBuilder<?, AndDescr> source = accumulate.source();
                  try {
                      helper.start(source,
                              CEDescrBuilder.class,
                              null);
                      lhsAnd(source,
                              true);
                      if (state.failed)
                          return null;
  
                      if (source.getDescr() != null && source.getDescr() instanceof ConditionalElementDescr) {
                          ConditionalElementDescr root = (ConditionalElementDescr) source.getDescr();
                          BaseDescr[] descrs = root.getDescrs().toArray(new BaseDescr[root.getDescrs().size()]);
                          root.getDescrs().clear();
                          for (int i = 0; i < descrs.length; i++) {
                              root.addOrMerge(descrs[i]);
                          }
                      }
                  } finally {
                      helper.end(CEDescrBuilder.class,
                              source);
                  }
  
                  if (input.LA(1) == DRL6Lexer.COMMA) {
                      match(input,
                              DRL6Lexer.COMMA,
                              null,
                              null,
                              DroolsEditorType.SYMBOL);
                      if (state.failed)
                          return null;
                  } else if (input.LA(-1) != DRL6Lexer.SEMICOLON) {
                      // lhsUnary will consume an optional SEMICOLON, so we need to check if it was consumed already
                      // or if we must fail consuming it now
                      match(input,
                              DRL6Lexer.SEMICOLON,
                              null,
                              null,
                              DroolsEditorType.SYMBOL);
                      if (state.failed)
                          return null;
                  }
  
                  // accumulate functions
                  accumulateFunctionBinding(accumulate);
                  if (state.failed)
                      return null;
  
                  while (input.LA(1) == DRL6Lexer.COMMA) {
                      match(input,
                              DRL6Lexer.COMMA,
                              null,
                              null,
                              DroolsEditorType.SYMBOL);
                      if (state.failed)
                          return null;
  
                      accumulateFunctionBinding(accumulate);
                      if (state.failed)
                          return null;
                  }
  
                  if (input.LA(1) == DRL6Lexer.SEMICOLON) {
                      match(input,
                              DRL6Lexer.SEMICOLON,
                              null,
                              null,
                              DroolsEditorType.SYMBOL);
                      if (state.failed)
                          return null;
  
                      constraints(pattern);
                  }
                  match(input,
                          DRL6Lexer.RIGHT_PAREN,
                          null,
                          null,
                          DroolsEditorType.SYMBOL);
                  if (state.failed)
                      return null;
              } finally {
                  helper.end(AccumulateDescrBuilder.class,
                          accumulate);
                  if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
                      helper.emit(Location.LOCATION_LHS_BEGIN_OF_CONDITION);
                  }
              }
          } finally {
              helper.end(PatternDescrBuilder.class,
                      pattern);
          }
  
          if (input.LA(1) == DRL6Lexer.SEMICOLON) {
              match(input,
                      DRL6Lexer.SEMICOLON,
                      null,
                      null,
                      DroolsEditorType.SYMBOL);
              if (state.failed)
                  return null;
          }
          return result;
      }