From ad7d8af6d1f8d755f6a885cb10692ac85a045c99 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 9 Feb 2019 07:15:56 +0100 Subject: [PATCH] style: factor printing of rules * src/gram.h, src/gram.c (rule_print): New. Use it. --- src/gram.c | 16 +++++++++++----- src/gram.h | 3 +++ src/lalr.c | 1 - src/lr0.c | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/gram.c b/src/gram.c index 0a414423..82e3500b 100644 --- a/src/gram.c +++ b/src/gram.c @@ -155,6 +155,13 @@ rule_rhs_print_xml (rule const *r, FILE *out, int level) } } +void +rule_print (rule const *r, rule const *prev_rule, FILE *out) +{ + rule_lhs_print (r, prev_rule ? prev_rule->lhs : NULL, out); + rule_rhs_print (r, out); +} + void ritem_print (FILE *out) { @@ -186,7 +193,7 @@ grammar_rules_partial_print (FILE *out, const char *title, rule_filter filter) { bool first = true; - sym_content *previous_lhs = NULL; + rule *previous_rule = NULL; /* rule # : LHS -> RHS */ for (rule_number r = 0; r < nrules + nuseless_productions; r++) @@ -195,13 +202,12 @@ grammar_rules_partial_print (FILE *out, const char *title, continue; if (first) fprintf (out, "%s\n\n", title); - else if (previous_lhs && previous_lhs != rules[r].lhs) + else if (previous_rule && previous_rule->lhs != rules[r].lhs) fputc ('\n', out); first = false; - rule_lhs_print (&rules[r], previous_lhs, out); - rule_rhs_print (&rules[r], out); + rule_print (&rules[r], previous_rule, out); fputc ('\n', out); - previous_lhs = rules[r].lhs; + previous_rule = &rules[r]; } if (!first) fputs ("\n\n", out); diff --git a/src/gram.h b/src/gram.h index 5be1abe9..24cee8ff 100644 --- a/src/gram.h +++ b/src/gram.h @@ -248,6 +248,9 @@ size_t rule_rhs_length (rule const *r); /* Print this rule's RHS on OUT. */ void rule_rhs_print (rule const *r, FILE *out); +/* Print this rule on OUT. If a PREVIOUS_RULE was already displayed, + avoid useless repetitions of their LHS. */ +void rule_print (rule const *r, rule const *prev_rule, FILE *out); diff --git a/src/lalr.c b/src/lalr.c index 5e78b229..03e807de 100644 --- a/src/lalr.c +++ b/src/lalr.c @@ -241,7 +241,6 @@ build_relations (void) rp--; if (ISVAR (*rp)) { - /* Downcasting from item_number to symbol_number. */ edge[nedges++] = map_goto (states1[--length], item_number_as_symbol_number (*rp)); if (nullable[*rp - ntokens]) diff --git a/src/lr0.c b/src/lr0.c index 970fc1c8..b41cc46e 100644 --- a/src/lr0.c +++ b/src/lr0.c @@ -376,7 +376,7 @@ generate_states (void) closure (s->items, s->nitems); /* Record the reductions allowed out of this state. */ save_reductions (s); - /* Find the itemsets of the states that shifts can reach. */ + /* Find the itemsets of the states that shifts/gotos can reach. */ new_itemsets (s); /* Find or create the core structures for those states. */ append_states (s);