code: private ExpressionNode readLogicalOR() {
          final List<ExpressionNode> ops = new ArrayList<ExpressionNode>();
          ops.add(readLogicalAND());
  
          while (true) {
              int savepoint = filter.position();
              if (filter.hasSignificantSubSequence(LogicalOperator.OR.getOperatorString())) {
                  ops.add(readLogicalAND());
              } else {
                  filter.setPosition(savepoint);
                  break;
              }
          }
  
          return 1 == ops.size() ? ops.get(0) : LogicalExpressionNode.createLogicalOr(ops);
      }
docs: /*
  LogicalOR               = LogicalAND { '||' LogicalAND }
  LogicalAND              = LogicalANDOperand { '&&' LogicalANDOperand }
  LogicalANDOperand       = RelationalExpression | '(' LogicalOR ')' | '!' LogicalANDOperand
  RelationalExpression    = Value [ RelationalOperator Value ]