]>
git.saurik.com Git - bison.git/blob - src/print_graph.c
   1 /* Output a VCG description on generated parser, for Bison, 
   2    Copyright 2001 Free Software Foundation, Inc. 
   4    This file is part of Bison, the GNU Compiler Compiler. 
   6    Bison is free software; you can redistribute it and/or modify 
   7    it under the terms of the GNU General Public License as published by 
   8    the Free Software Foundation; either version 2, or (at your option) 
  11    Bison is distributed in the hope that it will be useful, 
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  14    GNU General Public License for more details. 
  16    You should have received a copy of the GNU General Public License 
  17    along with Bison; see the file COPYING.  If not, write to 
  18    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19    Boston, MA 02111-1307, USA.  */ 
  28 #include "conflicts.h" 
  35 #include "print_graph.h" 
  39 static FILE *fgraph 
= NULL
; 
  42 /*----------------------------. 
  43 | Construct the node labels.  | 
  44 `----------------------------*/ 
  47 print_core (struct obstack 
*oout
, state_t 
*state
) 
  50   item_number_t 
*sitems 
= state
->items
; 
  51   int snritems   
= state
->nitems
; 
  53   /* Output all the items of a state, not only its kernel.  */ 
  54   if (report_flag 
& report_itemsets
) 
  56       closure (sitems
, snritems
); 
  61   obstack_fgrow1 (oout
, "state %2d\n", state
->number
); 
  62   for (i 
= 0; i 
< snritems
; i
++) 
  68       sp1 
= sp 
= ritem 
+ sitems
[i
]; 
  73       rule 
= item_number_as_rule_number (*sp
); 
  76         obstack_1grow (oout
, '\n'); 
  77       obstack_fgrow1 (oout
, " %s -> ", 
  78                       rules
[rule
].lhs
->tag
); 
  80       for (sp 
= rules
[rule
].rhs
; sp 
< sp1
; sp
++) 
  81         obstack_fgrow1 (oout
, "%s ", symbols
[*sp
]->tag
); 
  83       obstack_1grow (oout
, '.'); 
  85       for (/* Nothing */; *sp 
>= 0; ++sp
) 
  86         obstack_fgrow1 (oout
, " %s", symbols
[*sp
]->tag
); 
  88       /* Experimental feature: display the lookaheads. */ 
  89       if (report_flag 
& report_lookaheads
) 
  91           /* Find the reduction we are handling.  */ 
  92           reductions_t 
*reds 
= state
->reductions
; 
  93           int redno 
= state_reduction_find (state
, &rules
[rule
]); 
  95           /* Print them if there are.  */ 
  96           if (reds
->lookaheads 
&& redno 
!= -1) 
  98               bitset_iterator biter
; 
 101               obstack_sgrow (oout
, "["); 
 102               BITSET_FOR_EACH (biter
, reds
->lookaheads
[redno
], k
, 0) 
 103                 obstack_fgrow2 (oout
, "%s%s", 
 104                                 not_first
++ ? ", " : "", 
 106               obstack_sgrow (oout
, "]"); 
 113 /*---------------------------------------------------------------. 
 114 | Output in graph_obstack edges specifications in incidence with | 
 116 `---------------------------------------------------------------*/ 
 119 print_actions (state_t 
*state
, const char *node_name
) 
 123   transitions_t     
*transitions 
= state
->transitions
; 
 124   reductions_t 
*redp 
= state
->reductions
; 
 126   static char buff
[10]; 
 129   if (!transitions
->num 
&& !redp
) 
 132   for (i 
= 0; i 
< transitions
->num
; i
++) 
 133     if (!TRANSITION_IS_DISABLED (transitions
, i
)) 
 135         state_t 
*state1 
= transitions
->states
[i
]; 
 136         symbol_number_t symbol 
= state1
->accessing_symbol
; 
 140         if (state
->number 
> state1
->number
) 
 141           edge
.type 
= back_edge
; 
 142         open_edge (&edge
, fgraph
); 
 143         /* The edge source is the current node.  */ 
 144         edge
.sourcename 
= node_name
; 
 145         sprintf (buff
, "%d", state1
->number
); 
 146         edge
.targetname 
= buff
; 
 147         /* Shifts are blue, gotos are green, and error is red. */ 
 148         if (TRANSITION_IS_ERROR (transitions
, i
)) 
 151           edge
.color 
= TRANSITION_IS_SHIFT(transitions
, i
) ? blue 
: green
; 
 152         edge
.label 
= symbols
[symbol
]->tag
; 
 153         output_edge (&edge
, fgraph
); 
 159 /*-------------------------------------------------------------. 
 160 | Output in FGRAPH the current node specifications and exiting | 
 162 `-------------------------------------------------------------*/ 
 165 print_state (state_t 
*state
) 
 167   static char name
[10]; 
 168   struct obstack node_obstack
; 
 171   /* The labels of the nodes are their the items.  */ 
 172   obstack_init (&node_obstack
); 
 174   sprintf (name
, "%d", state
->number
); 
 176   print_core (&node_obstack
, state
); 
 177   obstack_1grow (&node_obstack
, '\0'); 
 178   node
.label 
= obstack_finish (&node_obstack
); 
 181   output_node (&node
, fgraph
); 
 184   /* Output the edges.  */ 
 185   print_actions (state
, name
); 
 187   obstack_free (&node_obstack
, 0); 
 197   fgraph 
= xfopen (spec_graph_file
, "w"); 
 202   graph
.smanhattan_edges 
= yes
; 
 203   graph
.manhattan_edges 
= yes
; 
 206   graph
.display_edge_labels 
= yes
; 
 207   graph
.layoutalgorithm 
= normal
; 
 209   graph
.port_sharing 
= no
; 
 210   graph
.finetuning 
= yes
; 
 211   graph
.straight_phase 
= yes
; 
 212   graph
.priority_phase 
= yes
; 
 215   graph
.crossing_weight 
= median
; 
 217   /* Output graph options. */ 
 219   output_graph (&graph
, fgraph
); 
 221   /* Output nodes and edges. */ 
 222   new_closure (nritems
); 
 223   for (i 
= 0; i 
< nstates
; i
++) 
 224     print_state (states
[i
]); 
 228   close_graph (&graph
, fgraph
);