]> git.saurik.com Git - bison.git/blobdiff - src/gram.c
* src/getargs.h (trace_e): Add trace_scan, and trace_parse.
[bison.git] / src / gram.c
index c28f5b5ed2d1abbb319837f9278035d1d2e8a29f..ebb7e7399e45ffe85438fdae31ab1fe0454a10a9 100644 (file)
@@ -47,6 +47,40 @@ int glr_parser = 0;
 int pure_parser = 0;
 
 
 int pure_parser = 0;
 
 
+/*--------------------------------------------------------------.
+| Return true IFF the rule has a `number' smaller than NRULES.  |
+`--------------------------------------------------------------*/
+
+bool
+rule_useful_p (rule_t *r)
+{
+  return r->number < nrules;
+}
+
+
+/*-------------------------------------------------------------.
+| Return true IFF the rule has a `number' higher than NRULES.  |
+`-------------------------------------------------------------*/
+
+bool
+rule_useless_p (rule_t *r)
+{
+  return r->number >= nrules;
+}
+
+
+/*--------------------------------------------------------------------.
+| Return true IFF the rule is not flagged as useful *and* is useful.  |
+| In other words, it was discarded because of conflicts.              |
+`--------------------------------------------------------------------*/
+
+bool
+rule_never_reduced_p (rule_t *r)
+{
+  return !r->useful && r->number < nrules;
+}
+
+
 /*----------------------------------------------------------------.
 | Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was |
 | already displayed (by a previous call for another rule), avoid  |
 /*----------------------------------------------------------------.
 | Print this RULE's number and lhs on OUT.  If a PREVIOUS_LHS was |
 | already displayed (by a previous call for another rule), avoid  |
@@ -158,29 +192,34 @@ ritem_longest_rhs (void)
 }
 
 
 }
 
 
-/*----------------------------------------------------------------.
-| Print the grammar's rules numbers from BEGIN (inclusive) to END |
-| (exclusive) on OUT under TITLE.                                 |
-`----------------------------------------------------------------*/
+/*-----------------------------------------------------------------.
+| Print the grammar's rules that match FILTER on OUT under TITLE.  |
+`-----------------------------------------------------------------*/
 
 void
 grammar_rules_partial_print (FILE *out, const char *title,
 
 void
 grammar_rules_partial_print (FILE *out, const char *title,
-                            rule_number_t begin, rule_number_t end)
+                            rule_filter_t filter)
 {
   int r;
 {
   int r;
+  bool first = TRUE;
   symbol_t *previous_lhs = NULL;
 
   /* rule # : LHS -> RHS */
   symbol_t *previous_lhs = NULL;
 
   /* rule # : LHS -> RHS */
-  fprintf (out, "%s\n\n", title);
-  for (r = begin; r < end; r++)
+  for (r = 0; r < nrules + nuseless_productions; r++)
     {
     {
-      if (previous_lhs && previous_lhs != rules[r].lhs)
+      if (filter && !filter (&rules[r]))
+       continue;
+      if (first)
+       fprintf (out, "%s\n\n", title);
+      else if (previous_lhs && previous_lhs != rules[r].lhs)
        fputc ('\n', out);
        fputc ('\n', out);
+      first = FALSE;
       rule_lhs_print (&rules[r], previous_lhs, out);
       rule_rhs_print (&rules[r], out);
       previous_lhs = rules[r].lhs;
     }
       rule_lhs_print (&rules[r], previous_lhs, out);
       rule_rhs_print (&rules[r], out);
       previous_lhs = rules[r].lhs;
     }
-  fputs ("\n\n", out);
+  if (!first)
+    fputs ("\n\n", out);
 }
 
 
 }
 
 
@@ -191,7 +230,7 @@ grammar_rules_partial_print (FILE *out, const char *title,
 void
 grammar_rules_print (FILE *out)
 {
 void
 grammar_rules_print (FILE *out)
 {
-  grammar_rules_partial_print (out, _("Grammar"), 0, nrules);
+  grammar_rules_partial_print (out, _("Grammar"), rule_useful_p);
 }
 
 
 }
 
 
@@ -229,17 +268,18 @@ grammar_dump (FILE *out, const char *title)
       {
        rule_t *rule = &rules[i];
        item_number_t *r = NULL;
       {
        rule_t *rule = &rules[i];
        item_number_t *r = NULL;
-       int rhs_count = 0;
+       unsigned int rhs_itemno = rule->rhs - ritem;
+       unsigned int rhs_count = 0;
        /* Find the last RHS index in ritems. */
        for (r = rule->rhs; *r >= 0; ++r)
          ++rhs_count;
        /* Find the last RHS index in ritems. */
        for (r = rule->rhs; *r >= 0; ++r)
          ++rhs_count;
-       fprintf (out, "%3d (%2d, %2d, %2d, %2d-%2d)   %2d ->",
+       fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u)   %2d ->",
                 i,
                 rule->prec ? rule->prec->prec : 0,
                 rule->prec ? rule->prec->assoc : 0,
                 rule->useful,
                 i,
                 rule->prec ? rule->prec->prec : 0,
                 rule->prec ? rule->prec->assoc : 0,
                 rule->useful,
-                rule->rhs - ritem,
-                rule->rhs - ritem + rhs_count - 1,
+                rhs_itemno,
+                rhs_itemno + rhs_count - 1,
                 rule->lhs->number);
        /* Dumped the RHS. */
        for (r = rule->rhs; *r >= 0; r++)
                 rule->lhs->number);
        /* Dumped the RHS. */
        for (r = rule->rhs; *r >= 0; r++)
@@ -262,6 +302,27 @@ grammar_dump (FILE *out, const char *title)
 }
 
 
 }
 
 
+/*------------------------------------------------------------------.
+| Report on STDERR the rules that are not flagged USEFUL, using the |
+| MESSAGE (which can be `useless rule' when invoked after grammar   |
+| reduction, or `never reduced' after conflicts were taken into     |
+| account).                                                         |
+`------------------------------------------------------------------*/
+
+void
+grammar_rules_never_reduced_report (const char *message)
+{
+  rule_number_t r;
+  for (r = 0; r < nrules ; ++r)
+    if (!rules[r].useful)
+      {
+       LOCATION_PRINT (stderr, rules[r].location);
+       fprintf (stderr, ": %s: %s: ",
+                _("warning"), message);
+       rule_print (&rules[r], stderr);
+      }
+}
+
 void
 grammar_free (void)
 {
 void
 grammar_free (void)
 {