+
+/*--------------------------------------------------------------.
+| Return true IFF the rule has a `number' smaller than NRULES. |
+`--------------------------------------------------------------*/
+
+bool
+rule_useful_p (rule *r)
+{
+ return r->number < nrules;
+}
+
+
+/*-------------------------------------------------------------.
+| Return true IFF the rule has a `number' higher than NRULES. |
+`-------------------------------------------------------------*/
+
+bool
+rule_useless_p (rule *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 *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 |
+| useless repetitions. |
+`----------------------------------------------------------------*/
+
+void
+rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out)
+{
+ fprintf (out, " %3d ", r->number);
+ if (previous_lhs != r->lhs)
+ {
+ fprintf (out, "%s:", r->lhs->tag);
+ }
+ else
+ {
+ int n;
+ for (n = strlen (previous_lhs->tag); n > 0; --n)
+ fputc (' ', out);
+ fputc ('|', out);
+ }
+}
+
+
+/*--------------------------------------.
+| Return the number of symbols in RHS. |
+`--------------------------------------*/
+
+int
+rule_rhs_length (rule *r)
+{
+ int res = 0;
+ item_number *rhsp;
+ for (rhsp = r->rhs; *rhsp >= 0; ++rhsp)
+ ++res;
+ return res;
+}
+
+
+/*-------------------------------.
+| Print this rule's RHS on OUT. |
+`-------------------------------*/
+
+void
+rule_rhs_print (rule *r, FILE *out)
+{
+ if (*r->rhs >= 0)
+ {
+ item_number *rp;
+ for (rp = r->rhs; *rp >= 0; rp++)
+ fprintf (out, " %s", symbols[*rp]->tag);
+ fputc ('\n', out);
+ }
+ else
+ {
+ fprintf (out, " /* %s */\n", _("empty"));
+ }
+}
+
+
+/*-------------------------.
+| Print this rule on OUT. |
+`-------------------------*/
+
+void
+rule_print (rule *r, FILE *out)
+{
+ fprintf (out, "%s:", r->lhs->tag);
+ rule_rhs_print (r, out);
+}