1 /* $Id: graph.c,v 1.8 2014/02/19 00:46:57 Tom.Shields Exp $ */
2
3 #include "defs.h"
4
5 static void graph_state(int stateno);
6 static void graph_LA(int ruleno);
7
8 static unsigned int larno;
9
10 void
graph(void)11 graph(void)
12 {
13 int i;
14 int j;
15 shifts *sp;
16 int sn;
17 int as;
18
19 if (!gflag)
20 return;
21
22 for (i = 0; i < nstates; ++i)
23 {
24 closure(state_table[i]->items, state_table[i]->nitems);
25 graph_state(i);
26 }
27
28 fprintf(graph_file, "\n\n");
29 for (i = 0; i < nstates; ++i)
30 {
31
32 sp = shift_table[i];
33 if (sp)
34 for (j = 0; j < sp->nshifts; ++j)
35 {
36 sn = sp->shift[j];
37 as = accessing_symbol[sn];
38 fprintf(graph_file,
39 "\tq%d -> q%d [label=\"%s\"];\n",
40 i, sn, symbol_pname[as]);
41 }
42 }
43
44 fprintf(graph_file, "}\n");
45
46 for (i = 0; i < nsyms; ++i)
47 FREE(symbol_pname[i]);
48 FREE(symbol_pname);
49 }
50
51 static void
graph_state(int stateno)52 graph_state(int stateno)
53 {
54 Value_t *isp;
55 int rule;
56 Value_t *sp;
57 Value_t *sp1;
58
59 larno = (unsigned)lookaheads[stateno];
60 fprintf(graph_file, "\n\tq%d [label=\"%d:\\l", stateno, stateno);
61
62 for (isp = itemset; isp < itemsetend; isp++)
63 {
64 sp1 = sp = ritem + *isp;
65
66 while (*sp >= 0)
67 ++sp;
68 rule = -(*sp);
69 fprintf(graph_file, " %s -> ", symbol_pname[rlhs[rule]]);
70
71 for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
72 fprintf(graph_file, "%s ", symbol_pname[*sp]);
73
74 putc('.', graph_file);
75
76 while (*sp >= 0)
77 {
78 fprintf(graph_file, " %s", symbol_pname[*sp]);
79 sp++;
80 }
81
82 if (*sp1 < 0)
83 graph_LA(-*sp1);
84
85 fprintf(graph_file, "\\l");
86 }
87 fprintf(graph_file, "\"];");
88 }
89
90 static void
graph_LA(int ruleno)91 graph_LA(int ruleno)
92 {
93 int i;
94 unsigned tokensetsize;
95 unsigned *rowp;
96
97 tokensetsize = (unsigned)WORDSIZE(ntokens);
98
99 if (ruleno == LAruleno[larno])
100 {
101 rowp = LA + larno * tokensetsize;
102
103 fprintf(graph_file, " { ");
104 for (i = ntokens - 1; i >= 0; i--)
105 {
106 if (BIT(rowp, i))
107 fprintf(graph_file, "%s ", symbol_pname[i]);
108 }
109 fprintf(graph_file, "}");
110 ++larno;
111 }
112 }
113