diff --git a/src/ltlparse/ltlparse.yy b/src/ltlparse/ltlparse.yy index 15000e7eb..b02b63668 100644 --- a/src/ltlparse/ltlparse.yy +++ b/src/ltlparse/ltlparse.yy @@ -376,12 +376,31 @@ rationalexp: booleanatom | rationalexp OP_FUSION error { missing_right_binop($$, $1, @2, "fusion operator"); } | rationalexp starargs - { $$ = bunop::instance(bunop::Star, $1, $2.min, $2.max); } + { + if ($2.max < $2.min) + { + error_list.push_back(parse_error(@2, "reversed range")); + std::swap($2.max, $2.min); + } + $$ = bunop::instance(bunop::Star, $1, $2.min, $2.max); + } | starargs - { $$ = bunop::instance(bunop::Star, constant::true_instance(), - $1.min, $1.max); } + { + if ($1.max < $1.min) + { + error_list.push_back(parse_error(@1, "reversed range")); + std::swap($1.max, $1.min); + } + $$ = bunop::instance(bunop::Star, constant::true_instance(), + $1.min, $1.max); + } | rationalexp equalargs { + if ($2.max < $2.min) + { + error_list.push_back(parse_error(@2, "reversed range")); + std::swap($2.max, $2.min); + } if ($1->is_boolean()) { $$ = bunop::instance(bunop::Equal, $1, $2.min, $2.max); @@ -399,6 +418,11 @@ rationalexp: booleanatom } | rationalexp gotoargs { + if ($2.max < $2.min) + { + error_list.push_back(parse_error(@2, "reversed range")); + std::swap($2.max, $2.min); + } if ($1->is_boolean()) { $$ = bunop::instance(bunop::Goto, $1, $2.min, $2.max); diff --git a/src/ltltest/parseerr.test b/src/ltltest/parseerr.test index 20d0c2714..185453e7b 100755 --- a/src/ltltest/parseerr.test +++ b/src/ltltest/parseerr.test @@ -1,6 +1,6 @@ #! /bin/sh -# Copyright (C) 2009, 2010 Laboratoire de Recherche et Développement -# de l'Epita (LRDE). +# Copyright (C) 2009, 2010, 2011 Laboratoire de Recherche et +# Développement de l'Epita (LRDE). # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # département Systèmes Répartis Coopératifs (SRC), Université Pierre # et Marie Curie. @@ -85,6 +85,13 @@ run 0 ../equals -E 'a & (a + b c' 'a & (0)' run 0 ../equals -E 'a & (+' 'a & (0)' run 0 ../equals -E 'a & (' 'a & (0)' +# Invalid ranges +run 0 ../equals -E '{a[*8..1];b}' '{a[*1..8];b}' +run 0 ../equals -E '{a[=8..1];b}' '{a[=1..8];b}' +run 0 ../equals -E '{a[->8..1];b}' '{a[->1..8];b}' +run 0 ../equals -E '{a[->..0];b}' '{a[->0..1];b}' + + check 'a - b' 'AP(a)' '>>> a - b ^ syntax error, unexpected $undefined