bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 0/5] Conflict Counterexample Generation


From: Akim Demaille
Subject: Re: [PATCH 0/5] Conflict Counterexample Generation
Date: Wed, 13 May 2020 19:58:37 +0200

Hi Vincent,

I have addressed a number of minor issues in your code in your own commit.  
Maybe at some point I should resend the current state of these commits.

But I have fixed a number of improper behavior in the commit below (mostly 
related to following our conventions, starting with: diagnostics are on stderr, 
not stdout).

Once I have fixed the test suite by providing it with the expected values, I 
can see that we have at least to SEGV: tests 247 and 253.  I will leave this to 
you, and will be back to work on this tomorrow in the morning (French time).

Please, *do start on my branch*.  My branch is the current state of work on 
your contribution.  Start from it, I won't rebase again to get something, I 
spent too much time already.

My branch is "cex", available currently on both GitHub and Savannah.

Cheers!




commit 0d72c68954d5575d2aa6d26b440558b53f901918
Author: Akim Demaille <address@hidden>
Date:   Wed May 13 18:38:09 2020 +0200

    cex: fixes
    
    * src/conflicts.c, src/counterexample.c, src/derivation.c:
    Do not output diagnostics on stdout, that's the job of stderr, and the
    testsuite heavily depend on this.
    Do not leave trailing spaces in the output.
    * tests/counterexample.at: Use AT_KEYWORDS.
    Specify the expected outputs.
    * tests/local.mk: Add counterexample.at.

diff --git a/src/conflicts.c b/src/conflicts.c
index 3cf21c47..b6cccd76 100644
--- a/src/conflicts.c
+++ b/src/conflicts.c
@@ -625,6 +625,15 @@ conflicts_total_count (void)
   return count_sr_conflicts () + count_rr_conflicts ();
 }
 
+static state_item_number
+find_state_item_number (const rule *r, state_number sn)
+{
+  for (int i = state_item_map[sn]; i < state_item_map[sn + 1]; ++i)
+    if (item_number_as_rule_number (*state_items[i].item) == r->number)
+      return i;
+  abort ();
+}
+
 static void
 report_state_counterexamples (const state *s)
 {
@@ -633,19 +642,8 @@ report_state_counterexamples (const state *s)
   for (int i = 0; i < reds->num; ++i)
     {
       rule *r1 = reds->rules[i];
-      state_item_number c1;
-      for (int j = state_item_map[sn];
-           j < state_item_map[sn + 1]; ++j)
-        {
-          if (item_number_as_rule_number (*state_items[j].item) == r1->number)
-            {
-              c1 = j;
-              break;
-            }
-        }
-
-      for (int j = state_item_map[sn];
-           j < state_item_map[sn + 1]; ++j)
+      const state_item_number c1 = find_state_item_number (r1, sn);
+      for (int j = state_item_map[sn]; j < state_item_map[sn + 1]; ++j)
         {
           if (SI_DISABLED (j))
             continue;
diff --git a/src/counterexample.c b/src/counterexample.c
index daf7f213..bdd54c79 100644
--- a/src/counterexample.c
+++ b/src/counterexample.c
@@ -18,22 +18,25 @@
  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <config.h>
-#include <time.h>
-#include <hash.h>
-#include <stdlib.h>
+
+#include "counterexample.h"
+
 #include <gl_linked_list.h>
-#include <gl_xlist.h>
 #include <gl_rbtreehash_list.h>
-#include "counterexample.h"
-#include "derivation.h"
-#include "gram.h"
-#include "complain.h"
+#include <gl_xlist.h>
+#include <hash.h>
+#include <stdlib.h>
+#include <time.h>
+
 #include "closure.h"
-#include "nullable.h"
+#include "complain.h"
+#include "derivation.h"
 #include "getargs.h"
+#include "gram.h"
 #include "lalr.h"
-#include "parse-simulation.h"
 #include "lssi.h"
+#include "nullable.h"
+#include "parse-simulation.h"
 
 
 #define TIME_LIMIT_ENFORCED true
@@ -80,21 +83,22 @@ new_counterexample (const derivation *d1, const derivation 
*d2,
 void
 print_counterexample (counterexample *cex)
 {
+  FILE *out = stderr;
   if (cex->unifying)
-    printf ("Example ");
+    fprintf (out, "Example  ");
   else
-    printf ("First  Example");
-  derivation_print_leaves (cex->d1, stdout);
-  printf ("\nFirst  derivation ");
-  derivation_print (cex->d1, stdout);
+    fprintf (out, "First  Example ");
+  derivation_print_leaves (cex->d1, out);
+  fprintf (out, "\nFirst  derivation ");
+  derivation_print (cex->d1, out);
   if (!cex->unifying)
     {
-      printf ("\nSecond Example ");
-      derivation_print_leaves (cex->d2, stdout);
+      fprintf (out, "\nSecond Example ");
+      derivation_print_leaves (cex->d2, out);
     }
-  printf ("\nSecond derivation ");
-  derivation_print (cex->d2, stdout);
-  fputs ("\n\n", stdout);
+  fprintf (out, "\nSecond derivation ");
+  derivation_print (cex->d2, out);
+  fputs ("\n\n", out);
 }
 
 /*
@@ -461,11 +465,11 @@ nonunifying_shift_path (gl_list_t reduce_path, state_item 
*shift_conflict)
     }
   if (trace_flag & trace_cex)
     {
-      puts ("SHIFT ITEM PATH:");
+      fputs ("SHIFT ITEM PATH:\n", stderr);
       gl_list_iterator_t it = gl_list_iterator (result);
       state_item *sip;
       while (gl_list_iterator_next (&it, (const void **) &sip, NULL))
-        print_state_item (sip, stdout);
+        print_state_item (sip, stderr);
     }
   return result;
 }
@@ -560,11 +564,11 @@ search_state_free (search_state *ss)
 static void
 search_state_print (search_state *ss)
 {
-  fputs ("CONFLICT 1 ", stdout);
+  fputs ("CONFLICT 1 ", stderr);
   print_parse_state (ss->states[0]);
-  fputs ("CONFLICT 2 ", stdout);
+  fputs ("CONFLICT 2 ", stderr);
   print_parse_state (ss->states[1]);
-  putc ('\n', stdout);
+  putc ('\n', stderr);
 }
 
 /*
@@ -1069,13 +1073,14 @@ unifying_example (state_item_number itm1,
               if (!assurance_printed && time_passed > ASSURANCE_LIMIT
                   && stage3result)
                 {
-                  puts
-                    ("Productions leading up to the conflict state found.  
Still finding a possible unifying counterexample...");
+                  fputs ("Productions leading up to the conflict state found.  
"
+                         "Still finding a possible unifying counterexample...",
+                         stderr);
                   assurance_printed = true;
                 }
               if (time_passed > TIME_LIMIT)
                 {
-                  printf ("time limit exceeded: %f\n", time_passed);
+                  fprintf (stderr, "time limit exceeded: %f\n", time_passed);
                   goto cex_search_end;
                 }
             }
@@ -1153,12 +1158,10 @@ counterexample_report (state_item_number itm1, 
state_item_number itm2,
         bitset_set (rpp_set, si->state->number);
     }
   time_t t = time (NULL);
-  counterexample *cex = difftime (t,
-                                  cumulative_time) <
-    CUMULATIVE_TIME_LIMIT ? unifying_example (itm1, itm2, shift_reduce,
-                                              shortest_path,
-                                              next_sym) :
-    example_from_path (shift_reduce, itm2, shortest_path, next_sym);
+  counterexample *cex =
+    difftime (t, cumulative_time) < CUMULATIVE_TIME_LIMIT
+    ? unifying_example (itm1, itm2, shift_reduce, shortest_path, next_sym)
+    : example_from_path (shift_reduce, itm2, shortest_path, next_sym);
 
   gl_list_free (shortest_path);
   print_counterexample (cex);
@@ -1169,10 +1172,11 @@ void
 counterexample_report_shift_reduce (state_item_number itm1, state_item_number 
itm2,
                                     symbol_number next_sym)
 {
-  puts ("Shift-Reduce Conflict:");
-  print_state_item (&state_items[itm1], stdout);
-  print_state_item (&state_items[itm2], stdout);
-  printf ("On Symbol: %s\n", symbols[next_sym]->tag);
+  FILE *out = stderr;
+  fputs ("Shift-Reduce Conflict:\n", out);
+  print_state_item (&state_items[itm1], out);
+  print_state_item (&state_items[itm2], out);
+  fprintf (out, "On Symbol: %s\n", symbols[next_sym]->tag);
   counterexample_report (itm1, itm2, next_sym, true);
 }
 
@@ -1180,16 +1184,15 @@ void
 counterexample_report_reduce_reduce (state_item_number itm1, state_item_number 
itm2,
                                      bitset conflict_syms)
 {
-  puts ("Reduce-Reduce Conflict:");
-  print_state_item (&state_items[itm1], stdout);
-  print_state_item (&state_items[itm2], stdout);
-  fputs ("On Symbols: {", stdout);
+  FILE *out = stderr;
+  fputs ("Reduce-Reduce Conflict:\n", out);
+  print_state_item (&state_items[itm1], out);
+  print_state_item (&state_items[itm2], out);
+  fputs ("On Symbols: {", out);
   bitset_iterator biter;
   state_item_number sym;
   BITSET_FOR_EACH (biter, conflict_syms, sym, 0)
-    {
-      printf ("%s,", symbols[sym]->tag);
-    }
-  fputs ("}\n", stdout);
+    fprintf (out, "%s,", symbols[sym]->tag);
+  fputs ("}\n", out);
   counterexample_report (itm1, itm2, bitset_first (conflict_syms), false);
 }
diff --git a/src/derivation.c b/src/derivation.c
index b845ba89..a44627c5 100644
--- a/src/derivation.c
+++ b/src/derivation.c
@@ -68,21 +68,24 @@ derivation_print (const derivation *deriv, FILE *f)
 {
   if (deriv == &d_dot)
     {
-      fputs (" • ", f);
+      fputs (" •", f);
       return;
     }
   symbol *sym = symbols[deriv->sym];
   if (!deriv->children)
     {
-      fprintf (f, " %s ", sym->tag);
+      fprintf (f, " %s", sym->tag);
       return;
     }
   gl_list_iterator_t it = gl_list_iterator (deriv->children);
   derivation *child;
   fprintf (f, " %s ::=[", sym->tag);
   while (gl_list_iterator_next (&it, (const void **) &child, NULL))
-    derivation_print (child, f);
-  fputs ("] ", f);
+    {
+      derivation_print (child, f);
+      fputs (" ", f);
+    }
+  fputs ("]", f);
 }
 
 void
@@ -90,18 +93,23 @@ derivation_print_leaves (const derivation *deriv, FILE *f)
 {
   if (deriv == &d_dot)
     {
-      fputs (" • ", f);
+      fputs ("•", f);
       return;
     }
   if (!deriv->children)
     {
       symbol *sym = symbols[deriv->sym];
-      fprintf (f, " %s ", sym->tag);
+      fprintf (f, "%s", sym->tag);
       return;
     }
 
   gl_list_iterator_t it = gl_list_iterator (deriv->children);
+  const char *sep = "";
   derivation *child;
   while (gl_list_iterator_next (&it, (const void **) &child, NULL))
-    derivation_print_leaves (child, f);
+    {
+      fputs (sep, f);
+      sep = "  ";
+      derivation_print_leaves (child, f);
+    }
 }
diff --git a/tests/counterexample.at b/tests/counterexample.at
index a42ea013..65b1e361 100644
--- a/tests/counterexample.at
+++ b/tests/counterexample.at
@@ -23,6 +23,7 @@ AT_BANNER([[Counterexamples.]])
 ## --------------------- ##
 
 AT_SETUP([Unifying S/R])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B C
@@ -34,8 +35,17 @@ x: B | B C;
 y: A | A B;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+1:    3 a: A .
+1:    8 y: A . B
+On Symbol: B
+Example  A  •  B  C
+First  derivation  s ::=[ a ::=[ A  • ]  x ::=[ B  C ] ]
+Second derivation  s ::=[ y ::=[ A  •  B ]  c ::=[ C ] ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -45,6 +55,7 @@ AT_CLEANUP
 ## ------------------- ##
 
 AT_SETUP([Deep Unifying S/R])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B C
@@ -56,8 +67,17 @@ a: A | A a;
 bc: B bc C | B C;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+1:    7 a: A .
+1:    5 b: . B
+On Symbol: B
+Example  A  •  B  C
+First  derivation  s ::=[ a ::=[ A  • ]  bc ::=[ B  C ] ]
+Second derivation  s ::=[ ac ::=[ A  ac ::=[ b ::=[ •  B ] ]  C ] ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -67,6 +87,7 @@ AT_CLEANUP
 ## ------------------------------------ ##
 
 AT_SETUP([S/R Conflict with Nullable Symbols])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B X Y
@@ -79,8 +100,26 @@ y: %empty | Y y;
 xby: B | X xby Y;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+1:    4 x: . %empty
+1:    9 xby: . B
+On Symbol: B
+Example  A  •  B  y
+First  derivation  s ::=[ ax ::=[ A  x ::=[ • ] ]  by ::=[ B  y ] ]
+Second derivation  s ::=[ A  xby ::=[ •  B ] ]
+
+Shift-Reduce Conflict:
+5:    4 x: . %empty
+5:    9 xby: . B
+On Symbol: B
+First  Example A  X  •  B  y  $end
+First  derivation  $accept ::=[ s ::=[ ax ::=[ A  x ::=[ X  x ::=[ • ] ] ]  by 
::=[ B  y ] ]  $end ]
+Second Example A  X  •  B  Y  $end
+Second derivation  $accept ::=[ s ::=[ A  xby ::=[ X  xby ::=[ •  B ]  Y ] ]  
$end ]
+
+input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y:5.4-9: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -90,6 +129,7 @@ AT_CLEANUP
 ## ---------------------------- ##
 
 AT_SETUP([Non-unifying Ambiguous S/R])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B C D E
@@ -102,8 +142,18 @@ cd: C D;
 bc: B C;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+2:    7 b: B .
+2:    9 bc: B . C
+On Symbol: C
+First  Example B  •  C  D  $end
+First  derivation  $accept ::=[ g ::=[ x ::=[ b ::=[ B  • ]  cd ::=[ C  D ] ] 
]  $end ]
+Second Example B  •  C  $end
+Second derivation  $accept ::=[ g ::=[ x ::=[ bc ::=[ B  •  C ] ] ]  $end ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:6.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -113,6 +163,7 @@ AT_CLEANUP
 ## ------------------------------ ##
 
 AT_SETUP([Non-unifying Unambiguous S/R])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B
@@ -123,8 +174,17 @@ x: A;
 y: A A B;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+1:    5 x: A .
+1:    6 y: A . A B
+On Symbol: A
+First  Example A  •  A  $end
+First  derivation  $accept ::=[ s ::=[ s ::=[ t ::=[ x ::=[ A  • ] ] ]  t ::=[ 
x ::=[ A ] ] ]  $end ]
+Second Example A  •  A  B  $end
+Second derivation  $accept ::=[ s ::=[ t ::=[ y ::=[ A  •  A  B ] ] ]  $end ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 ]])
 
 AT_CLEANUP
@@ -134,6 +194,7 @@ AT_CLEANUP
 ## ----------------------- ##
 
 AT_SETUP([S/R after first token])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B X Y
@@ -149,8 +210,27 @@ xy: X Y;
 y: Y;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+4:    3 r: b .
+4:    7 s: b . A xx y
+On Symbol: A
+Example  b  •  A  X  X  Y
+First  derivation  a ::=[ r ::=[ b  • ]  t ::=[ A  x ::=[ X ]  xy ::=[ X  Y ] 
] ]
+Second derivation  a ::=[ s ::=[ b  •  xx ::=[ A  X  X ]  y ::=[ Y ] ] ]
+
+Shift-Reduce Conflict:
+10:    8 x: X .
+10:    9 xx: X . X
+On Symbol: X
+First  Example X  •  X
+First  derivation  t ::=[ x ::=[ X  • ]  X ]
+Second Example A  X  •  X
+Second derivation  a ::=[ t ::=[ A  xx ::=[ X  •  X ] ] ]
+
+input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
+input.y:4.4: warning: rule useless in parser due to conflicts [-Wother]
+input.y:8.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -160,6 +240,7 @@ AT_CLEANUP
 ## ----------------------------- ##
 
 AT_SETUP([Unifying R/R counterexample])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A
@@ -168,8 +249,17 @@ a : A b ;
 b : A | b;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Reduce-Reduce Conflict:
+4:    1 a: A b .
+4:    3 b: b .
+On Symbols: {$end,}
+Example  A  b  •
+First  derivation  a ::=[ A  b  • ]
+Second derivation  a ::=[ A  b ::=[ b  • ] ]
+
+input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
+input.y:4.9: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -179,6 +269,7 @@ AT_CLEANUP
 ## ------------------------------- ##
 
 AT_SETUP([Non-unifying R/R lr1 conflict])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A B C D
@@ -188,8 +279,18 @@ a: D;
 b: D;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Reduce-Reduce Conflict:
+2:    5 a: D .
+2:    6 b: D .
+On Symbols: {A,C,}
+First  Example D  •  A  $end
+First  derivation  $accept ::=[ s ::=[ a ::=[ D  • ]  A ]  $end ]
+Second Example B  D  •  A  $end
+Second derivation  $accept ::=[ s ::=[ B  b ::=[ D  • ]  A ]  $end ]
+
+input.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -199,6 +300,7 @@ AT_CLEANUP
 ## ------------------------------- ##
 
 AT_SETUP([Non-unifying R/R lr2 conflict])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token H J K X
@@ -208,8 +310,19 @@ a: H i;
 i: X | i J K;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+5:    2 a: H i .
+5:    4 i: i . J K
+On Symbol: J
+time limit exceeded: 6.000000
+First  Example H  i  •  J  $end
+First  derivation  $accept ::=[ s ::=[ a ::=[ H  i  • ]  J ]  $end ]
+Second Example H  i  •  J  K  $end
+Second derivation  $accept ::=[ a ::=[ H  i ::=[ i  •  J  K ] ]  $end ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:4.4-6: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -222,6 +335,7 @@ AT_CLEANUP
 # graph search
 
 AT_SETUP([Cex Search Prepend])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token N A B C D
@@ -232,8 +346,17 @@ a: A;
 b: A B C | A B D;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+4:    7 a: A .
+4:    8 b: A . B C
+On Symbol: B
+Example  N  A  •  B  C
+First  derivation  s ::=[ n ::=[ N  a ::=[ A  • ]  B ]  C ]
+Second derivation  s ::=[ n ::=[ N  b ::=[ A  •  B  C ] ] ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:5.4: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -246,6 +369,7 @@ AT_CLEANUP
 # precedence/associativity directives work.
 
 AT_SETUP([R/R cex with prec])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%left b
@@ -257,8 +381,24 @@ B : A b A;
 C : A c A;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Reduce-Reduce Conflict:
+3:    3 A: B .
+3:    5 A: . %empty
+On Symbols: {b,c,}
+Example  B  •  b  A  A  c  A
+First  derivation  S ::=[ B ::=[ A ::=[ B  • ]  b  A ]  C ::=[ A  c  A ] ]
+Second derivation  S ::=[ B  C ::=[ A ::=[ B ::=[ A ::=[ • ]  b  A ] ]  c  A ] 
]
+
+Reduce-Reduce Conflict:
+4:    4 A: C .
+4:    5 A: . %empty
+On Symbols: {b,c,}
+Example  C  •  c  A  A  b  A
+First  derivation  S ::=[ C ::=[ A ::=[ C  • ]  c  A ]  B ::=[ A  b  A ] ]
+Second derivation  S ::=[ C  B ::=[ A ::=[ C ::=[ A ::=[ • ]  c  A ] ]  b  A ] 
]
+
+input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr]
 ]])
 
 AT_CLEANUP
@@ -268,6 +408,7 @@ AT_CLEANUP
 ## ------------------- ##
 
 AT_SETUP([Null nonterminals])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token A
@@ -278,9 +419,8 @@ c : ;
 d : a | c A | d;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
-]])
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[]])
 
 AT_CLEANUP
 
@@ -289,6 +429,7 @@ AT_CLEANUP
 ## --------------------------- ##
 
 AT_SETUP([Non-unifying Prefix Share])
+AT_KEYWORDS([cex])
 
 # Tests for a counterexample which should start its derivation
 # at a shared symbol rather than the start symbol.
@@ -301,8 +442,17 @@ a: H i J J
 i: %empty | i J;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+7:    5 i: i J .
+7:    3 a: H i J . J
+On Symbol: J
+Example  H  i  J  •  J  J
+First  derivation  s ::=[ a ::=[ H  i ::=[ i  J  • ]  J  J ] ]
+Second derivation  s ::=[ a ::=[ H  i  J  •  J ]  J ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
+input.y:5.13-15: warning: rule useless in parser due to conflicts [-Wother]
 ]])
 
 AT_CLEANUP
@@ -315,6 +465,7 @@ AT_CLEANUP
 # are derived correctly.
 
 AT_SETUP([Deep Null Unifying])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token a d
@@ -326,8 +477,16 @@ C: %empty
 D: d;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+3:    5 C: . %empty
+3:    6 D: . d
+On Symbol: d
+Example  a  A  •  d
+First  derivation  S ::=[ a  A  A ::=[ B ::=[ C ::=[ • ] ] ]  D ::=[ d ] ]
+Second derivation  S ::=[ a  A  D ::=[ •  d ] ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 ]])
 
 AT_CLEANUP
@@ -339,6 +498,7 @@ AT_CLEANUP
 # Tests that expand_to_conflict works with nullable sybols
 
 AT_SETUP([Deep Null Non-unifying])
+AT_KEYWORDS([cex])
 
 AT_DATA([[input.y]],
 [[%token a d e
@@ -350,8 +510,17 @@ C: %empty
 D: d;
 ]])
 
-AT_BISON_CHECK([-Wcounterexample input.y], 0, [],
-[[
+AT_BISON_CHECK([-Wcounterexample input.y], [], [],
+[[Shift-Reduce Conflict:
+3:    5 C: . %empty
+3:    6 D: . d
+On Symbol: d
+First  Example a  A  •  d  e  $end
+First  derivation  $accept ::=[ S ::=[ a  A  A ::=[ B ::=[ C ::=[ • ] ] ]  D 
::=[ d ]  e ]  $end ]
+Second Example a  A  •  d  $end
+Second derivation  $accept ::=[ S ::=[ a  A  D ::=[ •  d ] ]  $end ]
+
+input.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 ]])
 
-AT_CLEANUP
\ No newline at end of file
+AT_CLEANUP
diff --git a/tests/local.mk b/tests/local.mk
index fac8426f..098b1ddb 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -47,6 +47,7 @@ TESTSUITE_AT =                                \
   %D%/c++.at                                  \
   %D%/calc.at                                 \
   %D%/conflicts.at                            \
+  %D%/counterexample.at                       \
   %D%/cxx-type.at                             \
   %D%/diagnostics.at                          \
   %D%/existing.at                             \




reply via email to

[Prev in Thread] Current Thread [Next in Thread]