1268899Sbapt/* $Id: graph.c,v 1.8 2014/02/19 00:46:57 Tom.Shields Exp $ */ 2234949Sbapt 3234949Sbapt#include "defs.h" 4234949Sbapt 5234949Sbaptstatic void graph_state(int stateno); 6234949Sbaptstatic void graph_LA(int ruleno); 7234949Sbapt 8234949Sbaptstatic unsigned int larno; 9234949Sbapt 10234949Sbaptvoid 11234949Sbaptgraph(void) 12234949Sbapt{ 13234949Sbapt int i; 14234949Sbapt int j; 15234949Sbapt shifts *sp; 16234949Sbapt int sn; 17234949Sbapt int as; 18234949Sbapt 19234949Sbapt if (!gflag) 20234949Sbapt return; 21234949Sbapt 22234949Sbapt for (i = 0; i < nstates; ++i) 23234949Sbapt { 24234949Sbapt closure(state_table[i]->items, state_table[i]->nitems); 25234949Sbapt graph_state(i); 26234949Sbapt } 27234949Sbapt 28234949Sbapt fprintf(graph_file, "\n\n"); 29234949Sbapt for (i = 0; i < nstates; ++i) 30234949Sbapt { 31234949Sbapt 32234949Sbapt sp = shift_table[i]; 33234949Sbapt if (sp) 34234949Sbapt for (j = 0; j < sp->nshifts; ++j) 35234949Sbapt { 36234949Sbapt sn = sp->shift[j]; 37234949Sbapt as = accessing_symbol[sn]; 38234949Sbapt fprintf(graph_file, 39234949Sbapt "\tq%d -> q%d [label=\"%s\"];\n", 40234949Sbapt i, sn, symbol_pname[as]); 41234949Sbapt } 42234949Sbapt } 43234949Sbapt 44234949Sbapt fprintf(graph_file, "}\n"); 45234949Sbapt 46234949Sbapt for (i = 0; i < nsyms; ++i) 47234949Sbapt FREE(symbol_pname[i]); 48234949Sbapt FREE(symbol_pname); 49234949Sbapt} 50234949Sbapt 51234949Sbaptstatic void 52234949Sbaptgraph_state(int stateno) 53234949Sbapt{ 54268899Sbapt Value_t *isp; 55234949Sbapt int rule; 56268899Sbapt Value_t *sp; 57268899Sbapt Value_t *sp1; 58234949Sbapt 59234949Sbapt larno = (unsigned)lookaheads[stateno]; 60234949Sbapt fprintf(graph_file, "\n\tq%d [label=\"%d:\\l", stateno, stateno); 61234949Sbapt 62234949Sbapt for (isp = itemset; isp < itemsetend; isp++) 63234949Sbapt { 64234949Sbapt sp1 = sp = ritem + *isp; 65234949Sbapt 66234949Sbapt while (*sp >= 0) 67234949Sbapt ++sp; 68234949Sbapt rule = -(*sp); 69234949Sbapt fprintf(graph_file, " %s -> ", symbol_pname[rlhs[rule]]); 70234949Sbapt 71234949Sbapt for (sp = ritem + rrhs[rule]; sp < sp1; sp++) 72234949Sbapt fprintf(graph_file, "%s ", symbol_pname[*sp]); 73234949Sbapt 74234949Sbapt putc('.', graph_file); 75234949Sbapt 76234949Sbapt while (*sp >= 0) 77234949Sbapt { 78234949Sbapt fprintf(graph_file, " %s", symbol_pname[*sp]); 79234949Sbapt sp++; 80234949Sbapt } 81234949Sbapt 82234949Sbapt if (*sp1 < 0) 83234949Sbapt graph_LA(-*sp1); 84234949Sbapt 85234949Sbapt fprintf(graph_file, "\\l"); 86234949Sbapt } 87234949Sbapt fprintf(graph_file, "\"];"); 88234949Sbapt} 89234949Sbapt 90234949Sbaptstatic void 91234949Sbaptgraph_LA(int ruleno) 92234949Sbapt{ 93234949Sbapt int i; 94234949Sbapt unsigned tokensetsize; 95234949Sbapt unsigned *rowp; 96234949Sbapt 97234949Sbapt tokensetsize = (unsigned)WORDSIZE(ntokens); 98234949Sbapt 99234949Sbapt if (ruleno == LAruleno[larno]) 100234949Sbapt { 101234949Sbapt rowp = LA + larno * tokensetsize; 102234949Sbapt 103234949Sbapt fprintf(graph_file, " { "); 104234949Sbapt for (i = ntokens - 1; i >= 0; i--) 105234949Sbapt { 106234949Sbapt if (BIT(rowp, i)) 107234949Sbapt fprintf(graph_file, "%s ", symbol_pname[i]); 108234949Sbapt } 109234949Sbapt fprintf(graph_file, "}"); 110234949Sbapt ++larno; 111234949Sbapt } 112234949Sbapt} 113