]> git.saurik.com Git - bison.git/commitdiff
graphs: style: use left justification for states
authorTheophile Ranquet <ranquet@lrde.epita.fr>
Mon, 8 Oct 2012 15:53:44 +0000 (15:53 +0000)
committerAkim Demaille <akim@lrde.epita.fr>
Thu, 11 Oct 2012 13:46:43 +0000 (15:46 +0200)
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 <akim@lrde.epita.fr>
src/graphviz.c
src/graphviz.h
src/print_graph.c

index c4eaa9f58dbc9f0a59b06d6c5f5b8d6d47139ba9..6498884ada5dfe56779ca1f506f570fc9923b53a 100644 (file)
@@ -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)
 {
index 556fdda1bbaa9bfa0f5fa2a510000e8a384722e3..62f26fb4705f233ceae95338a282c8cac7cef3be 100644 (file)
@@ -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_ */
index 88b2ceeabd40e25ba02bdfd9077c5a613a0edfa2..d1496af7cfbf0de36f14c436ad98ce17b1dadf6a 100644 (file)
@@ -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,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");
     }
 }