code: private void processConjunctionExpression(List<TerminalNode> conjunctions) {
      Predicate conjunctionReuse;
  
      for (int i = conjunctions.size() - 1; i >= 0; i--) {
        Predicate rhs = currentPredicates.removeLast();
        Predicate lhs = currentPredicates.removeLast();
  
        switch (conjunctions.get(i).getText().toLowerCase()) {
          case "and":
            conjunctionReuse = new And(lhs, rhs);
            break;
          case "or":
            conjunctionReuse = new Or(lhs, rhs);
            break;
          default:
            conjunctionReuse = new Xor(lhs, rhs);
            break;
        }
        currentPredicates.add(conjunctionReuse);
      }
    }
docs: Processes a conjuctive expression (AND, OR, XOR) and connects the filter with the corresponding operator
  
  @param conjunctions list of conjunction operators