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