code: protected RangeToken parseSetOperations() throws ParseException {
  		RangeToken tok = this.parseCharacterClass(false);
  		int type;
  		while ((type = this.read()) != T_RPAREN) {
  			int ch = this.chardata;
  			if (type == T_CHAR && (ch == '-' || ch == '&') || type == T_PLUS) {
  				this.next();
  				if (this.read() != T_LBRACKET)
  					throw ex("parser.ope.1", this.offset - 1);
  				RangeToken t2 = this.parseCharacterClass(false);
  				if (type == T_PLUS)
  					tok.mergeRanges(t2);
  				else if (ch == '-')
  					tok.subtractRanges(t2);
  				else if (ch == '&')
  					tok.intersectRanges(t2);
  				else
  					throw new RuntimeException("ASSERT");
  			} else {
  				throw ex("parser.ope.2", this.offset - 1);
  			}
  		}
  		this.next();
  		return tok;
  	}
docs: '(?[' ... ']' (('-' | '+' | '&') '[' ... ']')? ')'