]>
git.saurik.com Git - bison.git/blob - src/graphviz.c
1 /* Output Graphviz specification of a state machine generated by Bison.
3 Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* Written by Paul Eggert and Satya Kiran Popuri. */
32 /* Return an unambiguous printable representation for NAME, suitable
33 for C strings. Use slot 2 since the user may use slots 0 and 1. */
36 quote (char const *name
)
38 return quotearg_n_style (2, c_quoting_style
, name
);
42 start_graph (FILE *fout
)
45 _("// Generated by %s.\n"
46 "// Report bugs to <%s>.\n"
47 "// Home page: <%s>.\n"
55 quote (grammar_file
));
56 fprintf (fout
, "node [shape=box]\n");
60 output_node (int id
, char const *label
, FILE *fout
)
62 fprintf (fout
, " %d [label=\"%s\"]\n", id
, label
);
66 output_edge (int source
, int destination
, char const *label
,
67 char const *style
, FILE *fout
)
69 fprintf (fout
, " %d -> %d [style=%s", source
, destination
, style
);
71 fprintf (fout
, " label=%s", quote (label
));
76 escape (char const *name
)
78 char *q
= quote (name
);
79 q
[strlen (q
) - 1] = '\0';
84 no_reduce_bitset_init (state
const *s
, bitset
*no_reduce_set
)
87 *no_reduce_set
= bitset_create (ntokens
, BITSET_FIXED
);
88 bitset_zero (*no_reduce_set
);
89 FOR_EACH_SHIFT (s
->transitions
, n
)
90 bitset_set (*no_reduce_set
, TRANSITION_SYMBOL (s
->transitions
, n
));
91 for (n
= 0; n
< s
->errs
->num
; ++n
)
92 if (s
->errs
->symbols
[n
])
93 bitset_set (*no_reduce_set
, s
->errs
->symbols
[n
]->number
);
97 print_token (struct obstack
*out
, bool first
, char const *tok
)
99 char const *q
= escape (tok
);
102 obstack_sgrow (out
, ",");
103 obstack_sgrow (out
, q
);
108 output_red (state
const *s
, reductions
const *reds
, FILE *fout
)
110 bitset no_reduce_set
;
112 int source
= s
->number
;
115 no_reduce_bitset_init (s
, &no_reduce_set
);
116 obstack_init (&oout
);
118 for (j
= 0; j
< reds
->num
; ++j
)
120 bool disabled
= false;
122 int ruleno
= reds
->rules
[j
]->user_number
;
123 rule
*default_reduction
= NULL
;
125 if (yydefact
[s
->number
] != 0)
126 default_reduction
= &rules
[yydefact
[s
->number
] - 1];
128 /* First, print the edges that represent each possible reduction for
130 obstack_printf (&oout
, " %1$d -> \"%1$dR%2$d\" [label=\"",
132 if (default_reduction
&& default_reduction
== reds
->rules
[j
])
133 first
= print_token (&oout
, true, "$default");
137 for (i
= 0; i
< ntokens
; i
++)
138 if (bitset_test (reds
->lookahead_tokens
[j
], i
))
140 first
= print_token (&oout
, first
, symbols
[i
]->tag
);
141 if (bitset_test (no_reduce_set
, i
))
145 obstack_sgrow (&oout
, "\" style=solid]\n");
147 /* Then, print the reduction's representation. Done later since
148 we need to know whether this reduction is disabled. */
149 obstack_printf (&oout
,
151 "[style=filled shape=diamond fillcolor=%s "
154 disabled
? "firebrick1" : "yellowgreen",
157 /* If no lookahead tokens were valid transitions, this reduction is
158 actually disabled, so don't print it. */
160 (void) obstack_finish0 (&oout
);
162 fprintf (fout
, obstack_finish0 (&oout
));
164 obstack_free (&oout
, 0);
168 finish_graph (FILE *fout
)