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]);
+ {
+ /* 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, "]");
- }
- }
+ /* 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");
}
}