]>
git.saurik.com Git - bison.git/blob - src/graphviz.c
e62ee1d4d25600be0eab94db9bf05dd9356322d0
   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
)