mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-14 23:03:04 +00:00
reports: don't escape the labels
Currently we use "quotearg" to escape the strings output in Dot. As a
result, if the user's locale is C for instance, all the non-ASCII are
escaped. Unfortunately graphviz does not interpret this style of
escaping.
For instance:
5 -> 2 [style=solid label="\"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\""]
was displayed as a sequence of numbers. We now output:
5 -> 2 [style=solid label="\"Ñùṃéℝô\""]
independently of the user's locale.
* src/system.h (obstack_backslash): New.
* src/graphviz.h, src/graphviz.c (escape): Remove, use
obstack_backslash instead.
* src/print-graph.c: Likewise.
* tests/report.at: Adjust.
This commit is contained in:
@@ -72,18 +72,20 @@ output_edge (int source, int destination, char const *label,
|
|||||||
{
|
{
|
||||||
fprintf (fout, " %d -> %d [style=%s", source, destination, style);
|
fprintf (fout, " %d -> %d [style=%s", source, destination, style);
|
||||||
if (label)
|
if (label)
|
||||||
fprintf (fout, " label=%s", quote (label));
|
{
|
||||||
|
fputs (" label=\"", fout);
|
||||||
|
for (const char *cp = label; *cp; ++cp)
|
||||||
|
switch (*cp)
|
||||||
|
{
|
||||||
|
case '"': fputs ("\\\"", fout); break;
|
||||||
|
case '\\': fputs ("\\\\", fout); break;
|
||||||
|
default: fputc (*cp, fout); break;
|
||||||
|
}
|
||||||
|
fputc ('"', fout);
|
||||||
|
}
|
||||||
fputs ("]\n", fout);
|
fputs ("]\n", fout);
|
||||||
}
|
}
|
||||||
|
|
||||||
char const *
|
|
||||||
escape (char const *name)
|
|
||||||
{
|
|
||||||
char *q = quote (name);
|
|
||||||
q[strlen (q) - 1] = '\0';
|
|
||||||
return q + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
no_reduce_bitset_init (state const *s, bitset *no_reduce_set)
|
no_reduce_bitset_init (state const *s, bitset *no_reduce_set)
|
||||||
{
|
{
|
||||||
@@ -149,7 +151,7 @@ print_token (struct obstack *out, bool first, char const *tok)
|
|||||||
{
|
{
|
||||||
if (! first)
|
if (! first)
|
||||||
obstack_sgrow (out, ", ");
|
obstack_sgrow (out, ", ");
|
||||||
obstack_sgrow (out, escape (tok));
|
obstack_backslash (out, tok);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,10 +63,4 @@ void output_red (state const *s, reductions const *reds, FILE *fout);
|
|||||||
*/
|
*/
|
||||||
void finish_graph (FILE *fout);
|
void finish_graph (FILE *fout);
|
||||||
|
|
||||||
/** Escape a lookahead token.
|
|
||||||
*
|
|
||||||
* \param name the token.
|
|
||||||
*/
|
|
||||||
char const *escape (char const *name);
|
|
||||||
|
|
||||||
#endif /* ! GRAPHVIZ_H_ */
|
#endif /* ! GRAPHVIZ_H_ */
|
||||||
|
|||||||
@@ -72,19 +72,28 @@ print_core (struct obstack *oout, state *s)
|
|||||||
obstack_printf (oout, "%*s| ",
|
obstack_printf (oout, "%*s| ",
|
||||||
(int) strlen (previous_lhs->symbol->tag), "");
|
(int) strlen (previous_lhs->symbol->tag), "");
|
||||||
else
|
else
|
||||||
obstack_printf (oout, "%s: ", escape (r->lhs->symbol->tag));
|
{
|
||||||
|
obstack_backslash (oout, r->lhs->symbol->tag);
|
||||||
|
obstack_printf (oout, ": ");
|
||||||
|
}
|
||||||
previous_lhs = r->lhs;
|
previous_lhs = r->lhs;
|
||||||
|
|
||||||
for (item_number const *sp = r->rhs; sp < sp1; sp++)
|
for (item_number const *sp = r->rhs; sp < sp1; sp++)
|
||||||
obstack_printf (oout, "%s ", escape (symbols[*sp]->tag));
|
{
|
||||||
|
obstack_backslash (oout, symbols[*sp]->tag);
|
||||||
|
obstack_1grow (oout, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
obstack_1grow (oout, '.');
|
obstack_1grow (oout, '.');
|
||||||
|
|
||||||
if (0 <= *r->rhs)
|
if (0 <= *r->rhs)
|
||||||
for (item_number const *sp = sp1; 0 <= *sp; ++sp)
|
for (item_number const *sp = sp1; 0 <= *sp; ++sp)
|
||||||
obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
|
{
|
||||||
|
obstack_1grow (oout, ' ');
|
||||||
|
obstack_backslash (oout, symbols[*sp]->tag);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
obstack_printf (oout, " %%empty");
|
obstack_sgrow (oout, " %empty");
|
||||||
|
|
||||||
/* Experimental feature: display the lookahead tokens. */
|
/* Experimental feature: display the lookahead tokens. */
|
||||||
if (report_flag & report_lookahead_tokens
|
if (report_flag & report_lookahead_tokens
|
||||||
@@ -104,7 +113,7 @@ print_core (struct obstack *oout, state *s)
|
|||||||
BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0)
|
BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0)
|
||||||
{
|
{
|
||||||
obstack_sgrow (oout, sep);
|
obstack_sgrow (oout, sep);
|
||||||
obstack_sgrow (oout, escape (symbols[k]->tag));
|
obstack_backslash (oout, symbols[k]->tag);
|
||||||
sep = ", ";
|
sep = ", ";
|
||||||
}
|
}
|
||||||
obstack_1grow (oout, ']');
|
obstack_1grow (oout, ']');
|
||||||
|
|||||||
17
src/system.h
17
src/system.h
@@ -171,6 +171,23 @@ typedef size_t uintptr_t;
|
|||||||
# define obstack_sgrow(Obs, Str) \
|
# define obstack_sgrow(Obs, Str) \
|
||||||
obstack_grow (Obs, Str, strlen (Str))
|
obstack_grow (Obs, Str, strlen (Str))
|
||||||
|
|
||||||
|
/* Output Str escaped to be a string.
|
||||||
|
|
||||||
|
For instance "\"foo\"" -> "\\\"foo\\\"". */
|
||||||
|
|
||||||
|
# define obstack_backslash(Obs, Str) \
|
||||||
|
do { \
|
||||||
|
char const *p__; \
|
||||||
|
for (p__ = Str; *p__; p__++) \
|
||||||
|
switch (*p__) \
|
||||||
|
{ \
|
||||||
|
case '"': obstack_sgrow (Obs, "\\\""); break; \
|
||||||
|
case '\\': obstack_sgrow (Obs, "\\\\"); break; \
|
||||||
|
default: obstack_1grow (Obs, *p__); break; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Output Str escaped for our postprocessing (i.e., escape M4 special
|
/* Output Str escaped for our postprocessing (i.e., escape M4 special
|
||||||
characters).
|
characters).
|
||||||
|
|
||||||
|
|||||||
@@ -1338,43 +1338,43 @@ digraph "input.y"
|
|||||||
node [fontname = courier, shape = box, colorscheme = paired6]
|
node [fontname = courier, shape = box, colorscheme = paired6]
|
||||||
edge [fontname = courier]
|
edge [fontname = courier]
|
||||||
|
|
||||||
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . exp \"\342\212\225\" exp\l 2 | . exp \"+\" exp\l 3 | . exp \"+\" exp\l 4 | . \"number\"\l 5 | . \"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\"\l"]
|
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . exp \"⊕\" exp\l 2 | . exp \"+\" exp\l 3 | . exp \"+\" exp\l 4 | . \"number\"\l 5 | . \"Ñùṃéℝô\"\l"]
|
||||||
0 -> 1 [style=solid label="\"number\""]
|
0 -> 1 [style=solid label="\"number\""]
|
||||||
0 -> 2 [style=solid label="\"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\""]
|
0 -> 2 [style=solid label="\"Ñùṃéℝô\""]
|
||||||
0 -> 3 [style=dashed label="exp"]
|
0 -> 3 [style=dashed label="exp"]
|
||||||
1 [label="State 1\n\l 4 exp: \"number\" .\l"]
|
1 [label="State 1\n\l 4 exp: \"number\" .\l"]
|
||||||
1 -> "1R4" [style=solid]
|
1 -> "1R4" [style=solid]
|
||||||
"1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
|
"1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
|
||||||
2 [label="State 2\n\l 5 exp: \"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\" .\l"]
|
2 [label="State 2\n\l 5 exp: \"Ñùṃéℝô\" .\l"]
|
||||||
2 -> "2R5" [style=solid]
|
2 -> "2R5" [style=solid]
|
||||||
"2R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
|
"2R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
|
||||||
3 [label="State 3\n\l 0 $accept: exp . $end\l 1 exp: exp . \"\342\212\225\" exp\l 2 | exp . \"+\" exp\l 3 | exp . \"+\" exp\l"]
|
3 [label="State 3\n\l 0 $accept: exp . $end\l 1 exp: exp . \"⊕\" exp\l 2 | exp . \"+\" exp\l 3 | exp . \"+\" exp\l"]
|
||||||
3 -> 4 [style=solid label="$end"]
|
3 -> 4 [style=solid label="$end"]
|
||||||
3 -> 5 [style=solid label="\"+\""]
|
3 -> 5 [style=solid label="\"+\""]
|
||||||
3 -> 6 [style=solid label="\"\342\212\225\""]
|
3 -> 6 [style=solid label="\"⊕\""]
|
||||||
4 [label="State 4\n\l 0 $accept: exp $end .\l"]
|
4 [label="State 4\n\l 0 $accept: exp $end .\l"]
|
||||||
4 -> "4R0" [style=solid]
|
4 -> "4R0" [style=solid]
|
||||||
"4R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
|
"4R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
|
||||||
5 [label="State 5\n\l 1 exp: . exp \"\342\212\225\" exp\l 2 | . exp \"+\" exp\l 2 | exp \"+\" . exp\l 3 | . exp \"+\" exp\l 3 | exp \"+\" . exp\l 4 | . \"number\"\l 5 | . \"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\"\l"]
|
5 [label="State 5\n\l 1 exp: . exp \"⊕\" exp\l 2 | . exp \"+\" exp\l 2 | exp \"+\" . exp\l 3 | . exp \"+\" exp\l 3 | exp \"+\" . exp\l 4 | . \"number\"\l 5 | . \"Ñùṃéℝô\"\l"]
|
||||||
5 -> 1 [style=solid label="\"number\""]
|
5 -> 1 [style=solid label="\"number\""]
|
||||||
5 -> 2 [style=solid label="\"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\""]
|
5 -> 2 [style=solid label="\"Ñùṃéℝô\""]
|
||||||
5 -> 7 [style=dashed label="exp"]
|
5 -> 7 [style=dashed label="exp"]
|
||||||
6 [label="State 6\n\l 1 exp: . exp \"\342\212\225\" exp\l 1 | exp \"\342\212\225\" . exp\l 2 | . exp \"+\" exp\l 3 | . exp \"+\" exp\l 4 | . \"number\"\l 5 | . \"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\"\l"]
|
6 [label="State 6\n\l 1 exp: . exp \"⊕\" exp\l 1 | exp \"⊕\" . exp\l 2 | . exp \"+\" exp\l 3 | . exp \"+\" exp\l 4 | . \"number\"\l 5 | . \"Ñùṃéℝô\"\l"]
|
||||||
6 -> 1 [style=solid label="\"number\""]
|
6 -> 1 [style=solid label="\"number\""]
|
||||||
6 -> 2 [style=solid label="\"\303\221\303\271\341\271\203\303\251\342\204\235\303\264\""]
|
6 -> 2 [style=solid label="\"Ñùṃéℝô\""]
|
||||||
6 -> 8 [style=dashed label="exp"]
|
6 -> 8 [style=dashed label="exp"]
|
||||||
7 [label="State 7\n\l 1 exp: exp . \"\342\212\225\" exp\l 2 | exp . \"+\" exp\l 2 | exp \"+\" exp . [$end, \"+\", \"\342\212\225\"]\l 3 | exp . \"+\" exp\l 3 | exp \"+\" exp . [$end, \"+\", \"\342\212\225\"]\l"]
|
7 [label="State 7\n\l 1 exp: exp . \"⊕\" exp\l 2 | exp . \"+\" exp\l 2 | exp \"+\" exp . [$end, \"+\", \"⊕\"]\l 3 | exp . \"+\" exp\l 3 | exp \"+\" exp . [$end, \"+\", \"⊕\"]\l"]
|
||||||
7 -> 6 [style=solid label="\"\342\212\225\""]
|
7 -> 6 [style=solid label="\"⊕\""]
|
||||||
7 -> "7R2d" [label="[\"\342\212\225\"]", style=solid]
|
7 -> "7R2d" [label="[\"⊕\"]", style=solid]
|
||||||
"7R2d" [label="R2", fillcolor=5, shape=diamond, style=filled]
|
"7R2d" [label="R2", fillcolor=5, shape=diamond, style=filled]
|
||||||
7 -> "7R2" [style=solid]
|
7 -> "7R2" [style=solid]
|
||||||
"7R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
|
"7R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
|
||||||
7 -> "7R3d" [label="[$end, \"+\", \"\342\212\225\"]", style=solid]
|
7 -> "7R3d" [label="[$end, \"+\", \"⊕\"]", style=solid]
|
||||||
"7R3d" [label="R3", fillcolor=5, shape=diamond, style=filled]
|
"7R3d" [label="R3", fillcolor=5, shape=diamond, style=filled]
|
||||||
8 [label="State 8\n\l 1 exp: exp . \"\342\212\225\" exp\l 1 | exp \"\342\212\225\" exp . [$end, \"+\", \"\342\212\225\"]\l 2 | exp . \"+\" exp\l 3 | exp . \"+\" exp\l"]
|
8 [label="State 8\n\l 1 exp: exp . \"⊕\" exp\l 1 | exp \"⊕\" exp . [$end, \"+\", \"⊕\"]\l 2 | exp . \"+\" exp\l 3 | exp . \"+\" exp\l"]
|
||||||
8 -> 5 [style=solid label="\"+\""]
|
8 -> 5 [style=solid label="\"+\""]
|
||||||
8 -> 6 [style=solid label="\"\342\212\225\""]
|
8 -> 6 [style=solid label="\"⊕\""]
|
||||||
8 -> "8R1d" [label="[\"+\", \"\342\212\225\"]", style=solid]
|
8 -> "8R1d" [label="[\"+\", \"⊕\"]", style=solid]
|
||||||
"8R1d" [label="R1", fillcolor=5, shape=diamond, style=filled]
|
"8R1d" [label="R1", fillcolor=5, shape=diamond, style=filled]
|
||||||
8 -> "8R1" [style=solid]
|
8 -> "8R1" [style=solid]
|
||||||
"8R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
|
"8R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
|
||||||
|
|||||||
Reference in New Issue
Block a user