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