bison-patches
[Top][All Lists]
Advanced

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

gram: detect and report (in debug traces) useless chain rules


From: Akim Demaille
Subject: gram: detect and report (in debug traces) useless chain rules
Date: Wed, 30 Jan 2019 07:10:52 +0100

commit 781d2b02dee9486350e55405f0c8fab1d954ff44
Author: Akim Demaille <address@hidden>
Date:   Tue Jan 29 18:53:35 2019 +0100

    gram: detect and report (in debug traces) useless chain rules
    
    A rule is a useless chain iff it's a chain (aka unit, or injection)
    rule (i.e., the RHS has length 1), and it's useless (it has no used
    defined semantic action).
    
    * src/gram.h, src/gram.c (rule_useless_chain_p): New.
    (grammar_dump): Report useless chain rules.
    * tests/sets.at: Check the traces.

diff --git a/src/gram.c b/src/gram.c
index 2f094944..0a414423 100644
--- a/src/gram.c
+++ b/src/gram.c
@@ -95,6 +95,12 @@ rule_useless_in_parser_p (rule const *r)
   return !r->useful && rule_useful_in_grammar_p (r);
 }
 
+bool
+rule_useless_chain_p (rule const *r)
+{
+  return rule_rhs_length (r) == 1 && !r->action;
+}
+
 void
 rule_lhs_print (rule const *r, sym_content const *previous_lhs, FILE *out)
 {
@@ -272,12 +278,13 @@ grammar_dump (FILE *out, const char *title)
         rule const *rule_i = &rules[i];
         unsigned const rhs_itemno = rule_i->rhs - ritem;
         unsigned length = rule_rhs_length (rule_i);
-        fprintf (out, "%3d (%3d, %2d, %2d, %2s, %2u-%2u)   %2d ->",
+        fprintf (out, "%3d (%3d, %2d, %2d, %2s, %2s, %2u-%2u)   %2d ->",
                  item_number_as_rule_number (rule_i->rhs[length]),
                  i,
                  rule_i->prec ? rule_i->prec->prec : 0,
                  rule_i->prec ? rule_i->prec->assoc : 0,
                  rule_i->useful ? "t" : "f",
+                 rule_useless_chain_p (rule_i) ? "t" : "f",
                  rhs_itemno,
                  rhs_itemno + length - 1,
                  rule_i->lhs->number);
diff --git a/src/gram.h b/src/gram.h
index f7918cd5..5be1abe9 100644
--- a/src/gram.h
+++ b/src/gram.h
@@ -232,6 +232,9 @@ bool rule_useless_in_grammar_p (rule const *r);
    grammar.  In other words, it was discarded because of conflicts.  */
 bool rule_useless_in_parser_p (rule const *r);
 
+/* Whether the rule has a single RHS, and no user action. */
+bool rule_useless_chain_p (rule const *r);
+
 /* Print this rule's number and lhs on OUT.  If a PREVIOUS_LHS was
    already displayed (by a previous call for another rule), avoid
    useless repetitions.  */
diff --git a/tests/sets.at b/tests/sets.at
index 01339c22..c9feb9d8 100644
--- a/tests/sets.at
+++ b/tests/sets.at
@@ -337,12 +337,12 @@ Rules
 -----
 
 Num (Num, Prec, Assoc, Useful, UselessChain, Ritem Range) Lhs -> Rhs (Ritem 
range)
-  0 (  0,  0,  0,  t,  0- 1)    6 ->   7   0
-  1 (  1,  0,  0,  t,  3- 5)    7 ->   7   3   8
-  2 (  2,  0,  0,  t,  7- 7)    7 ->   8
-  3 (  3,  0,  0,  t,  9-11)    8 ->   8   4   9
-  4 (  4,  0,  0,  t, 13-13)    8 ->   9
-  5 (  5,  0,  0,  t, 15-15)    9 ->   5
+  0 (  0,  0,  0,  t,  f,  0- 1)    6 ->   7   0
+  1 (  1,  0,  0,  t,  f,  3- 5)    7 ->   7   3   8
+  2 (  2,  0,  0,  t,  t,  7- 7)    7 ->   8
+  3 (  3,  0,  0,  t,  f,  9-11)    8 ->   8   4   9
+  4 (  4,  0,  0,  t,  t, 13-13)    8 ->   9
+  5 (  5,  0,  0,  t,  t, 15-15)    9 ->   5
 
 
 Rules interpreted




reply via email to

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