mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 17:53:02 +00:00
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.
This commit is contained in:
@@ -95,6 +95,12 @@ rule_useless_in_parser_p (rule const *r)
|
|||||||
return !r->useful && rule_useful_in_grammar_p (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
|
void
|
||||||
rule_lhs_print (rule const *r, sym_content const *previous_lhs, FILE *out)
|
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];
|
rule const *rule_i = &rules[i];
|
||||||
unsigned const rhs_itemno = rule_i->rhs - ritem;
|
unsigned const rhs_itemno = rule_i->rhs - ritem;
|
||||||
unsigned length = rule_rhs_length (rule_i);
|
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]),
|
item_number_as_rule_number (rule_i->rhs[length]),
|
||||||
i,
|
i,
|
||||||
rule_i->prec ? rule_i->prec->prec : 0,
|
rule_i->prec ? rule_i->prec->prec : 0,
|
||||||
rule_i->prec ? rule_i->prec->assoc : 0,
|
rule_i->prec ? rule_i->prec->assoc : 0,
|
||||||
rule_i->useful ? "t" : "f",
|
rule_i->useful ? "t" : "f",
|
||||||
|
rule_useless_chain_p (rule_i) ? "t" : "f",
|
||||||
rhs_itemno,
|
rhs_itemno,
|
||||||
rhs_itemno + length - 1,
|
rhs_itemno + length - 1,
|
||||||
rule_i->lhs->number);
|
rule_i->lhs->number);
|
||||||
|
|||||||
@@ -232,6 +232,9 @@ bool rule_useless_in_grammar_p (rule const *r);
|
|||||||
grammar. In other words, it was discarded because of conflicts. */
|
grammar. In other words, it was discarded because of conflicts. */
|
||||||
bool rule_useless_in_parser_p (rule const *r);
|
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
|
/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was
|
||||||
already displayed (by a previous call for another rule), avoid
|
already displayed (by a previous call for another rule), avoid
|
||||||
useless repetitions. */
|
useless repetitions. */
|
||||||
|
|||||||
@@ -337,12 +337,12 @@ Rules
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
Num (Num, Prec, Assoc, Useful, UselessChain, Ritem Range) Lhs -> Rhs (Ritem range)
|
Num (Num, Prec, Assoc, Useful, UselessChain, Ritem Range) Lhs -> Rhs (Ritem range)
|
||||||
0 ( 0, 0, 0, t, 0- 1) 6 -> 7 0
|
0 ( 0, 0, 0, t, f, 0- 1) 6 -> 7 0
|
||||||
1 ( 1, 0, 0, t, 3- 5) 7 -> 7 3 8
|
1 ( 1, 0, 0, t, f, 3- 5) 7 -> 7 3 8
|
||||||
2 ( 2, 0, 0, t, 7- 7) 7 -> 8
|
2 ( 2, 0, 0, t, t, 7- 7) 7 -> 8
|
||||||
3 ( 3, 0, 0, t, 9-11) 8 -> 8 4 9
|
3 ( 3, 0, 0, t, f, 9-11) 8 -> 8 4 9
|
||||||
4 ( 4, 0, 0, t, 13-13) 8 -> 9
|
4 ( 4, 0, 0, t, t, 13-13) 8 -> 9
|
||||||
5 ( 5, 0, 0, t, 15-15) 9 -> 5
|
5 ( 5, 0, 0, t, t, 15-15) 9 -> 5
|
||||||
|
|
||||||
|
|
||||||
Rules interpreted
|
Rules interpreted
|
||||||
|
|||||||
Reference in New Issue
Block a user