[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gram: detect and report (in debug traces) useless chain rules
From: |
Akim Demaille |
Subject: |
gram: detect and report (in debug traces) useless chain rules |
Date: |
Wed, 30 Jan 2019 07:10:52 +0100 |
commit 781d2b02dee9486350e55405f0c8fab1d954ff44
Author: Akim Demaille <address@hidden>
Date: Tue Jan 29 18:53:35 2019 +0100
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.
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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gram: detect and report (in debug traces) useless chain rules,
Akim Demaille <=