bison-patches
[Top][All Lists]
Advanced

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

[PATCH] cex: fix reporting of null nonterminals


From: Vincent Imbimbo
Subject: [PATCH] cex: fix reporting of null nonterminals
Date: Sun, 21 Jun 2020 16:20:45 -0400

I implemented this to print A ::= [ ], but A ::= [ %empty ] might be clearer.

* src/parse-simulation.c (nullable_closure): don't generate null nonterminal 
derivations as leaves.
* src/derivation.c (derivation_print_impl): don't print seperator spaces for 
null nonterminal.
* tests/counterexample.at: update test results
---
 src/derivation.c        | 34 ++++++++++++++++++++++++----------
 src/parse-simulation.c  |  2 +-
 tests/counterexample.at | 20 ++++++++++----------
 3 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/src/derivation.c b/src/derivation.c
index fe00d3df..52de1f77 100644
--- a/src/derivation.c
+++ b/src/derivation.c
@@ -126,11 +126,12 @@ derivation_size (const derivation *deriv)
   return size;
 }
 
-/* Print DERIV, colored according to COUNTER.  */
-static void
+/* Print DERIV, colored according to COUNTER.
+   returns false if nothing is printed */
+static bool
 derivation_print_impl (const derivation *deriv, FILE *f,
                        bool leaves_only,
-                       int *counter)
+                       int *counter, char *prefix)
 {
   if (deriv->children)
     {
@@ -142,41 +143,54 @@ derivation_print_impl (const derivation *deriv, FILE *f,
 
       if (!leaves_only)
         {
+          fputs (prefix, f);
           begin_use_class ("cex-step", f);
           fprintf (f, "%s ::=[ ", sym->tag);
           end_use_class ("cex-step", f);
+          prefix = "";
         }
-      const char *sep = "";
+      bool res = false;
       derivation *child;
       for (gl_list_iterator_t it = gl_list_iterator (deriv->children);
            derivation_list_next (&it, &child);
            )
         {
-          fputs (sep, f);
-          sep = " ";
-          derivation_print_impl (child, f, leaves_only, counter);
+          if (derivation_print_impl (child, f, leaves_only, counter, prefix))
+            {
+              prefix = " ";
+              res = true;
+            }
+          else if (!leaves_only)
+            prefix = " ";
         }
       if (!leaves_only)
         {
           begin_use_class ("cex-step", f);
-          fputs (" ]", f);
+          if (res)
+            fputs (" ]", f);
+          else
+            fputs ("]", f);
           end_use_class ("cex-step", f);
         }
       end_use_class (style, f);
+      return res;
     }
   else if (deriv == &d_dot)
     {
+      fputs (prefix, f);
       begin_use_class ("cex-dot", f);
       print_dot (f);
       end_use_class ("cex-dot", f);
     }
   else // leaf.
     {
+      fputs (prefix, f);
       const symbol *sym = symbols[deriv->sym];
       begin_use_class ("cex-leaf", f);
       fprintf (f, "%s", sym->tag);
       end_use_class ("cex-leaf", f);
     }
+  return true;
 }
 
 void
@@ -184,7 +198,7 @@ derivation_print (const derivation *deriv, FILE *out, const 
char *prefix)
 {
   int counter = 0;
   fputs (prefix, out);
-  derivation_print_impl (deriv, out, false, &counter);
+  derivation_print_impl (deriv, out, false, &counter, "");
   fputc ('\n', out);
 }
 
@@ -194,6 +208,6 @@ derivation_print_leaves (const derivation *deriv, FILE 
*out, const char *prefix)
 {
   int counter = 0;
   fputs (prefix, out);
-  derivation_print_impl (deriv, out, true, &counter);
+  derivation_print_impl (deriv, out, true, &counter, "");
   fputc ('\n', out);
 }
diff --git a/src/parse-simulation.c b/src/parse-simulation.c
index 615dbb2b..8e0a8675 100644
--- a/src/parse-simulation.c
+++ b/src/parse-simulation.c
@@ -426,7 +426,7 @@ nullable_closure (parse_state *ps, state_item *si, 
parse_state_list state_list)
       state_item *nsi = state_items + sin;
       current_ps = copy_parse_state (false, current_ps);
       ps_si_append (current_ps, nsi);
-      ps_derivs_append (current_ps, derivation_new_leaf (sp));
+      ps_derivs_append (current_ps, derivation_new (sp, derivation_list_new 
()));
       parse_state_list_append (state_list, current_ps);
     }
 }
diff --git a/tests/counterexample.at b/tests/counterexample.at
index fd77e96e..65dc03cc 100644
--- a/tests/counterexample.at
+++ b/tests/counterexample.at
@@ -107,8 +107,8 @@ xby: B | X xby Y;
 AT_BISON_CHECK_CEX([input.y], [], [],
 [[input.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
 Shift/reduce conflict on token B:
-  Example              A . B y
-  First derivation     s ::=[ ax ::=[ A x ::=[ . ] ] by ::=[ B y ] ]
+  Example              A . B
+  First derivation     s ::=[ ax ::=[ A x ::=[ . ] ] by ::=[ B y ::=[ ] ] ]
   Example              A . B
   Second derivation    s ::=[ A xby ::=[ . B ] ]
 
@@ -362,16 +362,16 @@ C : A c A;
 AT_BISON_CHECK_CEX([input.y], [], [],
 [[input.y: warning: 4 reduce/reduce conflicts [-Wconflicts-rr]
 Reduce/reduce conflict on tokens b, c:
-  Example              B . b A A c A
-  First derivation     S ::=[ B ::=[ A ::=[ B . ] b A ] C ::=[ A c A ] ]
-  Example              B . b A c A
-  Second derivation    S ::=[ B C ::=[ A ::=[ B ::=[ A ::=[ . ] b A ] ] c A ] ]
+  Example              B . b c
+  First derivation     S ::=[ B ::=[ A ::=[ B . ] b A ::=[ ] ] C ::=[ A ::=[ ] 
c A ::=[ ] ] ]
+  Example              B . b c
+  Second derivation    S ::=[ B C ::=[ A ::=[ B ::=[ A ::=[ . ] b A ::=[ ] ] ] 
c A ::=[ ] ] ]
 
 Reduce/reduce conflict on tokens b, c:
-  Example              C . c A A b A
-  First derivation     S ::=[ C ::=[ A ::=[ C . ] c A ] B ::=[ A b A ] ]
-  Example              C . c A b A
-  Second derivation    S ::=[ C B ::=[ A ::=[ C ::=[ A ::=[ . ] c A ] ] b A ] ]
+  Example              C . c b
+  First derivation     S ::=[ C ::=[ A ::=[ C . ] c A ::=[ ] ] B ::=[ A ::=[ ] 
b A ::=[ ] ] ]
+  Example              C . c b
+  Second derivation    S ::=[ C B ::=[ A ::=[ C ::=[ A ::=[ . ] c A ::=[ ] ] ] 
b A ::=[ ] ] ]
 
 ]])
 
-- 
2.20.1 (Apple Git-117)




reply via email to

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