docs: @SuppressWarnings("unchecked")
      private BaseDescr lhsPatternBind(PatternContainerDescrBuilder<?, ?> ce,
              final boolean allowOr) throws RecognitionException {
          PatternDescrBuilder<?> pattern = null;
          CEDescrBuilder<?, OrDescr> or = null;
          BaseDescr result = null;
  
          Token first = input.LT(1);
          pattern = helper.start((DescrBuilder<?, ?>) ce,
                  PatternDescrBuilder.class,
                  null);
          if (pattern != null) {
              result = pattern.getDescr();
          }
  
          String label = null;
          boolean isUnification = false;
          if (input.LA(1) == DRL6Lexer.ID && input.LA(2) == DRL6Lexer.COLON && !helper.validateCEKeyword(1)) {
              label = label(DroolsEditorType.IDENTIFIER_PATTERN);
              if (state.failed)
                  return null;
          } else if (input.LA(1) == DRL6Lexer.ID && input.LA(2) == DRL6Lexer.UNIFY && !helper.validateCEKeyword(1)) {
              label = unif(DroolsEditorType.IDENTIFIER_PATTERN);
              if (state.failed)
                  return null;
              isUnification = true;
          }
  
          if (input.LA(1) == DRL6Lexer.LEFT_PAREN) {
              try {
                  match(input,
                          DRL6Lexer.LEFT_PAREN,
                          null,
                          null,
                          DroolsEditorType.SYMBOL);
                  if (state.failed)
                      return null;
  
                  if (helper.validateCEKeyword(1)) {
                      failMismatchedTokenException();
                      return null; // in case it is backtracking
                  }
  
                  lhsPattern(pattern,
                          label,
                          isUnification);
                  if (state.failed)
                      return null;
  
                  if (allowOr && helper.validateIdentifierKey(DroolsSoftKeywords.OR) && ce instanceof CEDescrBuilder) {
                      if (state.backtracking == 0) {
                          // this is necessary because of the crappy bind with multi-pattern OR syntax
                          or = ((CEDescrBuilder<DescrBuilder<?, ?>, OrDescr>) ce).or();
                          result = or.getDescr();
  
                          helper.end(PatternDescrBuilder.class,
                                  pattern);
                          helper.start(or,
                                  CEDescrBuilder.class,
                                  null);
                          // adjust real or starting token:
                          helper.setStart(or,
                                  first);
  
                          // remove original pattern from the parent CE child list:
                          ((ConditionalElementDescr) ce.getDescr()).getDescrs().remove(pattern.getDescr());
                          // add pattern to the OR instead
                          or.getDescr().addDescr(pattern.getDescr());
                      }
  
                      while (helper.validateIdentifierKey(DroolsSoftKeywords.OR)) {
                          match(input,
                                  DRL6Lexer.ID,
                                  DroolsSoftKeywords.OR,
                                  null,
                                  DroolsEditorType.KEYWORD);
                          if (state.failed)
                              return null;
  
                          pattern = helper.start(or,
                                  PatternDescrBuilder.class,
                                  null);
                          // new pattern, same binding
                          lhsPattern(pattern,
                                  label,
                                  isUnification);
                          if (state.failed)
                              return null;
  
                          helper.end(PatternDescrBuilder.class,
                                  pattern);
                      }
                  }
  
                  match(input,
                          DRL6Lexer.RIGHT_PAREN,
                          null,
                          null,
                          DroolsEditorType.SYMBOL);
                  if (state.failed)
                      return null;
  
              } finally {
                  if (or != null) {
                      helper.end(CEDescrBuilder.class,
                              or);
                  } else {
                      helper.end(PatternDescrBuilder.class,
                              pattern);
                  }
              }
  
          } else {
              try {
                  lhsPattern(pattern,
                          label,
                          isUnification);
                  if (state.failed)
                      return null;
  
              } finally {
                  helper.end(PatternDescrBuilder.class,
                          pattern);
              }
          }
  
          return result;
      }