xref: /freebsd/contrib/byacc/graph.c (revision 8e022d3cdea10ee1039a632f670c27fd93f65625)
1*8e022d3cSDag-Erling Smørgrav /* $Id: graph.c,v 1.9 2020/09/10 17:22:51 tom Exp $ */
298e903e7SBaptiste Daroussin 
398e903e7SBaptiste Daroussin #include "defs.h"
498e903e7SBaptiste Daroussin 
598e903e7SBaptiste Daroussin static void graph_state(int stateno);
698e903e7SBaptiste Daroussin static void graph_LA(int ruleno);
798e903e7SBaptiste Daroussin 
898e903e7SBaptiste Daroussin static unsigned int larno;
998e903e7SBaptiste Daroussin 
1098e903e7SBaptiste Daroussin void
graph(void)1198e903e7SBaptiste Daroussin graph(void)
1298e903e7SBaptiste Daroussin {
1398e903e7SBaptiste Daroussin     int i;
1498e903e7SBaptiste Daroussin     int j;
1598e903e7SBaptiste Daroussin     shifts *sp;
1698e903e7SBaptiste Daroussin     int sn;
1798e903e7SBaptiste Daroussin     int as;
1898e903e7SBaptiste Daroussin 
1998e903e7SBaptiste Daroussin     if (!gflag)
2098e903e7SBaptiste Daroussin 	return;
2198e903e7SBaptiste Daroussin 
2298e903e7SBaptiste Daroussin     for (i = 0; i < nstates; ++i)
2398e903e7SBaptiste Daroussin     {
2498e903e7SBaptiste Daroussin 	closure(state_table[i]->items, state_table[i]->nitems);
2598e903e7SBaptiste Daroussin 	graph_state(i);
2698e903e7SBaptiste Daroussin     }
2798e903e7SBaptiste Daroussin 
2898e903e7SBaptiste Daroussin     fprintf(graph_file, "\n\n");
2998e903e7SBaptiste Daroussin     for (i = 0; i < nstates; ++i)
3098e903e7SBaptiste Daroussin     {
3198e903e7SBaptiste Daroussin 
3298e903e7SBaptiste Daroussin 	sp = shift_table[i];
3398e903e7SBaptiste Daroussin 	if (sp)
3498e903e7SBaptiste Daroussin 	    for (j = 0; j < sp->nshifts; ++j)
3598e903e7SBaptiste Daroussin 	    {
3698e903e7SBaptiste Daroussin 		sn = sp->shift[j];
3798e903e7SBaptiste Daroussin 		as = accessing_symbol[sn];
3898e903e7SBaptiste Daroussin 		fprintf(graph_file,
3998e903e7SBaptiste Daroussin 			"\tq%d -> q%d [label=\"%s\"];\n",
4098e903e7SBaptiste Daroussin 			i, sn, symbol_pname[as]);
4198e903e7SBaptiste Daroussin 	    }
4298e903e7SBaptiste Daroussin     }
4398e903e7SBaptiste Daroussin 
4498e903e7SBaptiste Daroussin     fprintf(graph_file, "}\n");
4598e903e7SBaptiste Daroussin 
4698e903e7SBaptiste Daroussin     for (i = 0; i < nsyms; ++i)
4798e903e7SBaptiste Daroussin 	FREE(symbol_pname[i]);
4898e903e7SBaptiste Daroussin     FREE(symbol_pname);
4998e903e7SBaptiste Daroussin }
5098e903e7SBaptiste Daroussin 
5198e903e7SBaptiste Daroussin static void
graph_state(int stateno)5298e903e7SBaptiste Daroussin graph_state(int stateno)
5398e903e7SBaptiste Daroussin {
540c8de5b0SBaptiste Daroussin     Value_t *isp;
550c8de5b0SBaptiste Daroussin     Value_t *sp;
5698e903e7SBaptiste Daroussin 
5798e903e7SBaptiste Daroussin     larno = (unsigned)lookaheads[stateno];
5898e903e7SBaptiste Daroussin     fprintf(graph_file, "\n\tq%d [label=\"%d:\\l", stateno, stateno);
5998e903e7SBaptiste Daroussin 
6098e903e7SBaptiste Daroussin     for (isp = itemset; isp < itemsetend; isp++)
6198e903e7SBaptiste Daroussin     {
62*8e022d3cSDag-Erling Smørgrav 	Value_t *sp1;
63*8e022d3cSDag-Erling Smørgrav 	int rule;
64*8e022d3cSDag-Erling Smørgrav 
6598e903e7SBaptiste Daroussin 	sp1 = sp = ritem + *isp;
6698e903e7SBaptiste Daroussin 
6798e903e7SBaptiste Daroussin 	while (*sp >= 0)
6898e903e7SBaptiste Daroussin 	    ++sp;
6998e903e7SBaptiste Daroussin 	rule = -(*sp);
7098e903e7SBaptiste Daroussin 	fprintf(graph_file, "  %s -> ", symbol_pname[rlhs[rule]]);
7198e903e7SBaptiste Daroussin 
7298e903e7SBaptiste Daroussin 	for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
7398e903e7SBaptiste Daroussin 	    fprintf(graph_file, "%s ", symbol_pname[*sp]);
7498e903e7SBaptiste Daroussin 
7598e903e7SBaptiste Daroussin 	putc('.', graph_file);
7698e903e7SBaptiste Daroussin 
7798e903e7SBaptiste Daroussin 	while (*sp >= 0)
7898e903e7SBaptiste Daroussin 	{
7998e903e7SBaptiste Daroussin 	    fprintf(graph_file, " %s", symbol_pname[*sp]);
8098e903e7SBaptiste Daroussin 	    sp++;
8198e903e7SBaptiste Daroussin 	}
8298e903e7SBaptiste Daroussin 
8398e903e7SBaptiste Daroussin 	if (*sp1 < 0)
8498e903e7SBaptiste Daroussin 	    graph_LA(-*sp1);
8598e903e7SBaptiste Daroussin 
8698e903e7SBaptiste Daroussin 	fprintf(graph_file, "\\l");
8798e903e7SBaptiste Daroussin     }
8898e903e7SBaptiste Daroussin     fprintf(graph_file, "\"];");
8998e903e7SBaptiste Daroussin }
9098e903e7SBaptiste Daroussin 
9198e903e7SBaptiste Daroussin static void
graph_LA(int ruleno)9298e903e7SBaptiste Daroussin graph_LA(int ruleno)
9398e903e7SBaptiste Daroussin {
9498e903e7SBaptiste Daroussin     unsigned tokensetsize;
9598e903e7SBaptiste Daroussin 
9698e903e7SBaptiste Daroussin     tokensetsize = (unsigned)WORDSIZE(ntokens);
9798e903e7SBaptiste Daroussin 
9898e903e7SBaptiste Daroussin     if (ruleno == LAruleno[larno])
9998e903e7SBaptiste Daroussin     {
100*8e022d3cSDag-Erling Smørgrav 	int i;
101*8e022d3cSDag-Erling Smørgrav 	unsigned *rowp = LA + larno * tokensetsize;
10298e903e7SBaptiste Daroussin 
10398e903e7SBaptiste Daroussin 	fprintf(graph_file, " { ");
10498e903e7SBaptiste Daroussin 	for (i = ntokens - 1; i >= 0; i--)
10598e903e7SBaptiste Daroussin 	{
10698e903e7SBaptiste Daroussin 	    if (BIT(rowp, i))
10798e903e7SBaptiste Daroussin 		fprintf(graph_file, "%s ", symbol_pname[i]);
10898e903e7SBaptiste Daroussin 	}
10998e903e7SBaptiste Daroussin 	fprintf(graph_file, "}");
11098e903e7SBaptiste Daroussin 	++larno;
11198e903e7SBaptiste Daroussin     }
11298e903e7SBaptiste Daroussin }
113