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 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,
- rule_number_t begin, rule_number_t end)
+ rule_filter_t filter)
{
int r;
+ bool first = TRUE;
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);
+ first = FALSE;
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);
}
void
grammar_rules_print (FILE *out)
{
- grammar_rules_partial_print (out, _("Grammar"), 0, nrules);
+ grammar_rules_partial_print (out, _("Grammar"), rule_useful_p);
}
{
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;
- 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,
- 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++)
}
+/*------------------------------------------------------------------.
+| 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)
{