]>
git.saurik.com Git - bison.git/blob - src/print_graph.c
9580f3f145ab9d204fc391bf63d0df6ea8382b98
   1 /* Output a VCG description on generated parser, for Bison, 
   3    Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison 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 2, or (at your option) 
  12    Bison 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 Bison; see the file COPYING.  If not, write to 
  19    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
  20    Boston, MA 02110-1301, USA.  */ 
  30 #include "conflicts.h" 
  35 #include "print_graph.h" 
  41 static graph static_graph
; 
  42 static FILE *fgraph 
= NULL
; 
  45 /*----------------------------. 
  46 | Construct the node labels.  | 
  47 `----------------------------*/ 
  50 print_core (struct obstack 
*oout
, state 
*s
) 
  53   item_number 
*sitems 
= s
->items
; 
  54   size_t snritems 
= s
->nitems
; 
  56   /* Output all the items of a state, not only its kernel.  */ 
  57   if (report_flag 
& report_itemsets
) 
  59       closure (sitems
, snritems
); 
  64   obstack_fgrow1 (oout
, "state %2d\n", s
->number
); 
  65   for (i 
= 0; i 
< snritems
; i
++) 
  71       sp1 
= sp 
= ritem 
+ sitems
[i
]; 
  76       r 
= item_number_as_rule_number (*sp
); 
  79         obstack_1grow (oout
, '\n'); 
  80       obstack_fgrow1 (oout
, " %s -> ", 
  83       for (sp 
= rules
[r
].rhs
; sp 
< sp1
; sp
++) 
  84         obstack_fgrow1 (oout
, "%s ", symbols
[*sp
]->tag
); 
  86       obstack_1grow (oout
, '.'); 
  88       for (/* Nothing */; *sp 
>= 0; ++sp
) 
  89         obstack_fgrow1 (oout
, " %s", symbols
[*sp
]->tag
); 
  91       /* Experimental feature: display the look-ahead tokens. */ 
  92       if (report_flag 
& report_look_ahead_tokens
) 
  94           /* Find the reduction we are handling.  */ 
  95           reductions 
*reds 
= s
->reductions
; 
  96           int redno 
= state_reduction_find (s
, &rules
[r
]); 
  98           /* Print them if there are.  */ 
  99           if (reds
->look_ahead_tokens 
&& redno 
!= -1) 
 101               bitset_iterator biter
; 
 103               char const *sep 
= ""; 
 104               obstack_sgrow (oout
, "["); 
 105               BITSET_FOR_EACH (biter
, reds
->look_ahead_tokens
[redno
], k
, 0) 
 107                   obstack_fgrow2 (oout
, "%s%s", sep
, symbols
[k
]->tag
); 
 110               obstack_sgrow (oout
, "]"); 
 117 /*---------------------------------------------------------------. 
 118 | Output in graph_obstack edges specifications in incidence with | 
 120 `---------------------------------------------------------------*/ 
 123 print_actions (state 
*s
, const char *node_name
) 
 127   transitions 
*trans 
= s
->transitions
; 
 128   reductions 
*reds 
= s
->reductions
; 
 130   static char buff
[10]; 
 133   if (!trans
->num 
&& !reds
) 
 136   for (i 
= 0; i 
< trans
->num
; i
++) 
 137     if (!TRANSITION_IS_DISABLED (trans
, i
)) 
 139         state 
*s1 
= trans
->states
[i
]; 
 140         symbol_number sym 
= s1
->accessing_symbol
; 
 144         if (s
->number 
> s1
->number
) 
 146         open_edge (&e
, fgraph
); 
 147         /* The edge source is the current node.  */ 
 148         e
.sourcename 
= node_name
; 
 149         sprintf (buff
, "%d", s1
->number
); 
 151         /* Shifts are blue, gotos are green, and error is red. */ 
 152         if (TRANSITION_IS_ERROR (trans
, i
)) 
 155           e
.color 
= TRANSITION_IS_SHIFT (trans
, i
) ? blue 
: green
; 
 156         e
.label 
= symbols
[sym
]->tag
; 
 157         output_edge (&e
, fgraph
); 
 163 /*-------------------------------------------------------------. 
 164 | Output in FGRAPH the current node specifications and exiting | 
 166 `-------------------------------------------------------------*/ 
 169 print_state (state 
*s
) 
 171   static char name
[10]; 
 172   struct obstack node_obstack
; 
 175   /* The labels of the nodes are their the items.  */ 
 176   obstack_init (&node_obstack
); 
 178   sprintf (name
, "%d", s
->number
); 
 180   print_core (&node_obstack
, s
); 
 181   obstack_1grow (&node_obstack
, '\0'); 
 182   n
.label 
= obstack_finish (&node_obstack
); 
 185   output_node (&n
, fgraph
); 
 188   /* Output the edges.  */ 
 189   print_actions (s
, name
); 
 191   obstack_free (&node_obstack
, 0); 
 201   fgraph 
= xfopen (spec_graph_file
, "w"); 
 203   new_graph (&static_graph
); 
 205   static_graph
.display_edge_labels 
= yes
; 
 207   static_graph
.port_sharing 
= no
; 
 208   static_graph
.finetuning 
= yes
; 
 209   static_graph
.priority_phase 
= yes
; 
 210   static_graph
.splines 
= yes
; 
 212   static_graph
.crossing_weight 
= median
; 
 214   /* Output graph options. */ 
 216   output_graph (&static_graph
, fgraph
); 
 218   /* Output nodes and edges. */ 
 219   new_closure (nritems
); 
 220   for (i 
= 0; i 
< nstates
; i
++) 
 221     print_state (states
[i
]); 
 225   close_graph (&static_graph
, fgraph
);