docs: private java.util.List<Expression> XreadExpressions(java.util.List<Boolean> ascDesc, boolean allowEmpty) {
          readThis(Tokens.OPENBRACKET);
  
          java.util.List<Expression> indexExprs = new java.util.ArrayList<>();
  
          while (true) {
              if (allowEmpty && readIfThis(Tokens.CLOSEBRACKET)) {    // empty bracket
                  return indexExprs;
              }
              Expression expression = XreadValueExpression();
              indexExprs.add(expression);
  
              if (token.tokenType == Tokens.DESC) {
                  throw unexpectedToken();
              }
              // A VoltDB extension to the "readColumnList(table, true)" support for descending-value indexes,
              // that similarly parses the asc/desc indicators but COLLECTS them so they can be ignored later,
              // rather than ignoring them on the spot.
              if (ascDesc != null) {
                  Boolean is_asc = Boolean.TRUE;
                  if (token.tokenType == Tokens.ASC
                          || token.tokenType == Tokens.DESC) {
                      read();
                      is_asc = (token.tokenType == Tokens.ASC);
                  }
                  ascDesc.add(is_asc);
              }
  
              if (readIfThis(Tokens.COMMA)) {
                  continue;
              }
  
              break;
          }
  
          readThis(Tokens.CLOSEBRACKET);
  
          return indexExprs;
      }