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