ISL_TOKEN_LEX_GE, ISL_TOKEN_LEX_LE,
ISL_TOKEN_LEX_GT, ISL_TOKEN_LEX_LT,
ISL_TOKEN_TO, ISL_TOKEN_AND,
- ISL_TOKEN_OR, ISL_TOKEN_EXISTS,
+ ISL_TOKEN_OR, ISL_TOKEN_EXISTS, ISL_TOKEN_NOT,
ISL_TOKEN_DEF, ISL_TOKEN_INFTY, ISL_TOKEN_NAN,
ISL_TOKEN_MAX, ISL_TOKEN_RAT,
ISL_TOKEN_STRING,
struct vars *v, __isl_take isl_basic_map *bmap)
{
isl_map *map;
+ int negate;
+ negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
map = read_conjunct(s, v, isl_basic_map_copy(bmap));
+ if (negate) {
+ isl_map *t;
+ t = isl_map_from_basic_map(isl_basic_map_copy(bmap));
+ map = isl_map_subtract(t, map);
+ }
+
while (isl_stream_eat_if_available(s, ISL_TOKEN_AND)) {
isl_map *map_i;
+ negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
map_i = read_conjunct(s, v, isl_basic_map_copy(bmap));
- map = isl_map_intersect(map, map_i);
+ if (negate)
+ map = isl_map_subtract(map, map_i);
+ else
+ map = isl_map_intersect(map, map_i);
}
isl_basic_map_free(bmap);
return ISL_TOKEN_AND;
if (!strcasecmp(s->buffer, "or"))
return ISL_TOKEN_OR;
+ if (!strcasecmp(s->buffer, "not"))
+ return ISL_TOKEN_NOT;
if (!strcasecmp(s->buffer, "infty"))
return ISL_TOKEN_INFTY;
if (!strcasecmp(s->buffer, "infinity"))
tok->u.s = strdup("||");
return tok;
}
+ if (c == '!') {
+ tok = isl_token_new(s->ctx, line, col, old_line != line);
+ if (!tok)
+ return NULL;
+ tok->type = ISL_TOKEN_NOT;
+ tok->u.s = strdup("!");
+ return tok;
+ }
tok = isl_token_new(s->ctx, line, col, old_line != line);
if (!tok)