From: Theophile Ranquet Date: Mon, 8 Oct 2012 15:53:44 +0000 (+0000) Subject: graphs: style: use left justification for states X-Git-Tag: v2.6.90~71 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/a13121f75994966dfbb7bed4de31dd7bb2516350?ds=sidebyside;hp=2be37f19fe2165fcfd8752a30b55308a5bdb9b84 graphs: style: use left justification for states The label text of nodes is centered "by default" (by the use of '\n' as a line feed). This gives bad readability to the grammar rules shown in state nodes, a left justification is much nicer. This is done by using '\l' as the line feed. In order to allow \l in the DOT file, changes to the quoting system seem necessary. * src/print_graph.c (print_core): Escape tokens here, instead of... * src/graphviz.c (output_node): Here... (escape): Using this, new. Signed-off-by: Akim Demaille --- diff --git a/src/graphviz.c b/src/graphviz.c index c4eaa9f5..6498884a 100644 --- a/src/graphviz.c +++ b/src/graphviz.c @@ -30,7 +30,7 @@ /* Return an unambiguous printable representation for NAME, suitable for C strings. Use slot 2 since the user may use slots 0 and 1. */ -static char const * +static char * quote (char const *name) { return quotearg_n_style (2, c_quoting_style, name); @@ -57,12 +57,12 @@ start_graph (FILE *fout) void output_node (int id, char const *label, FILE *fout) { - fprintf (fout, " %d [label=%s]\n", id, quote (label)); + fprintf (fout, " %d [label=\"%s\"]\n", id, label); } void output_edge (int source, int destination, char const *label, - char const *style, FILE *fout) + char const *style, FILE *fout) { fprintf (fout, " %d -> %d [style=%s", source, destination, style); if (label) @@ -70,6 +70,14 @@ output_edge (int source, int destination, char const *label, fputs ("]\n", fout); } +char const * +escape (char const *name) +{ + char *q = quote (name); + q[strlen (q) - 1] = '\0'; + return q + 1; +} + void finish_graph (FILE *fout) { diff --git a/src/graphviz.h b/src/graphviz.h index 556fdda1..62f26fb4 100644 --- a/src/graphviz.h +++ b/src/graphviz.h @@ -46,4 +46,8 @@ void output_edge (int source, int destination, char const *label, /// \param fout output stream. void finish_graph (FILE *fout); +/// Escape a lookahead token. +/// \param name the token. +char const *escape (char const *name); + #endif /* ! GRAPHVIZ_H_ */ diff --git a/src/print_graph.c b/src/print_graph.c index 88b2ceea..d1496af7 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -18,6 +18,7 @@ along with this program. If not, see . */ #include +#include #include "system.h" #include "LR0.h" @@ -54,7 +55,7 @@ print_core (struct obstack *oout, state *s) snritems = nitemset; } - obstack_printf (oout, "%d", s->number); + obstack_printf (oout, "%d\\n", s->number); for (i = 0; i < snritems; i++) { item_number *sp; @@ -64,43 +65,45 @@ print_core (struct obstack *oout, state *s) sp1 = sp = ritem + sitems[i]; while (*sp >= 0) - sp++; + sp++; r = item_number_as_rule_number (*sp); - obstack_printf (oout, "\n%d: %s -> ", r, rules[r].lhs->tag); + obstack_printf (oout, "%d: %s -> ", r, escape (rules[r].lhs->tag)); for (sp = rules[r].rhs; sp < sp1; sp++) - obstack_printf (oout, "%s ", symbols[*sp]->tag); + obstack_printf (oout, "%s ", escape (symbols[*sp]->tag)); obstack_1grow (oout, '.'); for (/* Nothing */; *sp >= 0; ++sp) - obstack_printf (oout, " %s", symbols[*sp]->tag); + obstack_printf (oout, " %s", escape (symbols[*sp]->tag)); /* Experimental feature: display the lookahead tokens. */ if (report_flag & report_lookahead_tokens && item_number_is_rule_number (*sp1)) - { - /* Find the reduction we are handling. */ - reductions *reds = s->reductions; - int redno = state_reduction_find (s, &rules[r]); - - /* Print them if there are. */ - if (reds->lookahead_tokens && redno != -1) - { - bitset_iterator biter; - int k; - char const *sep = ""; - obstack_sgrow (oout, "["); - BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0) - { - obstack_printf (oout, "%s%s", sep, symbols[k]->tag); - sep = ", "; - } - obstack_sgrow (oout, "]"); - } - } + { + /* Find the reduction we are handling. */ + reductions *reds = s->reductions; + int redno = state_reduction_find (s, &rules[r]); + + /* Print them if there are. */ + if (reds->lookahead_tokens && redno != -1) + { + bitset_iterator biter; + int k; + char const *sep = ""; + obstack_1grow (oout, '['); + BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0) + { + obstack_sgrow (oout, sep); + obstack_sgrow (oout, escape (symbols[k]->tag)); + sep = ", "; + } + obstack_1grow (oout, ']'); + } + } + obstack_sgrow (oout, "\\l"); } }