[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/6] graphs: style: use left justification for states
From: |
Theophile Ranquet |
Subject: |
[PATCH 3/6] graphs: style: use left justification for states |
Date: |
Wed, 10 Oct 2012 17:14:03 +0000 |
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, free_escape_buffer): Using these, new.
---
src/graphviz.c | 27 ++++++++++++++++++++++--
src/graphviz.h | 8 ++++++++
src/print_graph.c | 61 ++++++++++++++++++++++++++++++++-----------------------
3 files changed, 69 insertions(+), 27 deletions(-)
diff --git a/src/graphviz.c b/src/graphviz.c
index c4eaa9f..761e83f 100644
--- a/src/graphviz.c
+++ b/src/graphviz.c
@@ -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,29 @@ output_edge (int source, int destination, char const *label,
fputs ("]\n", fout);
}
+static char *escape_buffer = NULL;
+
+void
+free_escape_buffer ()
+{
+ free (escape_buffer);
+ escape_buffer = NULL;
+}
+
+char const *
+escape (char const *name)
+{
+ struct quoting_options *o = NULL;
+ if (! o)
+ {
+ o = clone_quoting_options (NULL);
+ set_quoting_style (o, escape_quoting_style);
+ set_char_quoting (o, '"', 1);
+ }
+ escape_buffer = quotearg_alloc (name, strlen (name), o);
+ return escape_buffer;
+}
+
void
finish_graph (FILE *fout)
{
diff --git a/src/graphviz.h b/src/graphviz.h
index 556fdda..8f5008a 100644
--- a/src/graphviz.h
+++ b/src/graphviz.h
@@ -46,4 +46,12 @@ 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);
+
+/* FIXME: This is not elegant. */
+/// Free the memory allocated by escape ().
+void free_escape_buffer (void);
+
#endif /* ! GRAPHVIZ_H_ */
diff --git a/src/print_graph.c b/src/print_graph.c
index 88b2cee..dd467a3 100644
--- a/src/print_graph.c
+++ b/src/print_graph.c
@@ -18,6 +18,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
+#include <quotearg.h>
#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,53 @@ 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));
+ free_escape_buffer ();
for (sp = rules[r].rhs; sp < sp1; sp++)
- obstack_printf (oout, "%s ", symbols[*sp]->tag);
+ {
+ obstack_printf (oout, "%s ", escape (symbols[*sp]->tag));
+ free_escape_buffer ();
+ }
obstack_1grow (oout, '.');
for (/* Nothing */; *sp >= 0; ++sp)
- obstack_printf (oout, " %s", symbols[*sp]->tag);
+ {
+ obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
+ free_escape_buffer ();
+ }
/* 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));
+ free_escape_buffer ();
+ sep = ", ";
+ }
+ obstack_1grow (oout, ']');
+ }
+ }
+ obstack_sgrow (oout, "\\l");
}
}
--
1.7.11.4
- [PATCH 0/6] {maint} Graphviz improvements, Theophile Ranquet, 2012/10/10
- [PATCH 1/6] obstack: import obstack_finish0 from master, Theophile Ranquet, 2012/10/10
- [PATCH 2/6] graphs: style: prefix rules and change shapes, Theophile Ranquet, 2012/10/10
- [PATCH 3/6] graphs: style: use left justification for states,
Theophile Ranquet <=
- Re: [PATCH 3/6] graphs: style: use left justification for states, Akim Demaille, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Théophile Ranquet, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Théophile Ranquet, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Théophile Ranquet, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Akim Demaille, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Théophile Ranquet, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Théophile Ranquet, 2012/10/11
- Re: [PATCH 3/6] graphs: style: use left justification for states, Akim Demaille, 2012/10/11
[PATCH 5/6] graphs: show reductions, Theophile Ranquet, 2012/10/10
[PATCH 4/6] graphs: style: prefix state number with "state", Theophile Ranquet, 2012/10/10