xref: /netbsd-src/external/bsd/byacc/dist/graph.c (revision 107c160af6c3e8860518cef217297b5cee8ea310)
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