X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/8ea6525e3a092b76256fbed7d6edbb0a1861aee1..d0a304384f4207bdf7f8b1038c2226c312f5e954:/src/print_graph.c?ds=sidebyside diff --git a/src/print_graph.c b/src/print_graph.c index ca1dc24e..5aa3cc62 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -40,11 +40,32 @@ | Construct the node labels. | `----------------------------*/ +/* Print the lhs of a rule in such a manner that there is no vertical + repetition, like in *.output files. */ + +static void +print_lhs (struct obstack *oout, rule *previous_rule, rule *r) +{ + if (previous_rule && STREQ (previous_rule->lhs->tag, r->lhs->tag)) + { + int i; + for (i = 0; i < strlen (r->lhs->tag); ++i) + obstack_1grow (oout, ' '); + obstack_1grow (oout, '|'); + } + else + { + obstack_sgrow (oout, escape (r->lhs->tag)); + obstack_1grow (oout, ':'); + } +} + static void print_core (struct obstack *oout, state *s) { - size_t i; item_number *sitems = s->items; + rule *previous_rule = NULL; + size_t i; size_t snritems = s->nitems; /* Output all the items of a state, not only its kernel. */ @@ -55,7 +76,8 @@ print_core (struct obstack *oout, state *s) snritems = nitemset; } - obstack_printf (oout, "state %d\\n", s->number); + obstack_printf (oout, _("State %d"), s->number); + obstack_sgrow (oout, "\\n"); for (i = 0; i < snritems; i++) { item_number *sp; @@ -69,12 +91,14 @@ print_core (struct obstack *oout, state *s) r = item_number_as_rule_number (*sp); - obstack_printf (oout, "%d: %s -> ", r, escape (rules[r].lhs->tag)); + obstack_printf (oout, "%3d ", r); + print_lhs (oout, previous_rule, &rules[r]); + previous_rule = &rules[r]; for (sp = rules[r].rhs; sp < sp1; sp++) obstack_printf (oout, "%s ", escape (symbols[*sp]->tag)); - obstack_1grow (oout, '.'); + obstack_sgrow (oout, " ."); for (/* Nothing */; *sp >= 0; ++sp) obstack_printf (oout, " %s", escape (symbols[*sp]->tag)); @@ -93,7 +117,7 @@ print_core (struct obstack *oout, state *s) bitset_iterator biter; int k; char const *sep = ""; - obstack_1grow (oout, '['); + obstack_sgrow (oout, " ["); BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0) { obstack_sgrow (oout, sep); @@ -116,9 +140,8 @@ print_core (struct obstack *oout, state *s) static void print_actions (state const *s, FILE *fgraph) { - int i; - transitions const *trans = s->transitions; + int i; /* Display reductions. */ output_red (s, s->reductions, fgraph);