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