summaryrefslogtreecommitdiffstats
path: root/contrib/byacc/graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/byacc/graph.c')
-rw-r--r--contrib/byacc/graph.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/contrib/byacc/graph.c b/contrib/byacc/graph.c
new file mode 100644
index 0000000..2e31231
--- /dev/null
+++ b/contrib/byacc/graph.c
@@ -0,0 +1,112 @@
+/* $Id: graph.c,v 1.7 2009/10/27 09:25:20 tom Exp $ */
+
+#include "defs.h"
+
+static void graph_state(int stateno);
+static void graph_LA(int ruleno);
+
+static unsigned int larno;
+
+void
+graph(void)
+{
+ int i;
+ int j;
+ shifts *sp;
+ int sn;
+ int as;
+
+ if (!gflag)
+ return;
+
+ for (i = 0; i < nstates; ++i)
+ {
+ closure(state_table[i]->items, state_table[i]->nitems);
+ graph_state(i);
+ }
+
+ fprintf(graph_file, "\n\n");
+ for (i = 0; i < nstates; ++i)
+ {
+
+ sp = shift_table[i];
+ if (sp)
+ for (j = 0; j < sp->nshifts; ++j)
+ {
+ sn = sp->shift[j];
+ as = accessing_symbol[sn];
+ fprintf(graph_file,
+ "\tq%d -> q%d [label=\"%s\"];\n",
+ i, sn, symbol_pname[as]);
+ }
+ }
+
+ fprintf(graph_file, "}\n");
+
+ for (i = 0; i < nsyms; ++i)
+ FREE(symbol_pname[i]);
+ FREE(symbol_pname);
+}
+
+static void
+graph_state(int stateno)
+{
+ short *isp;
+ int rule;
+ short *sp;
+ short *sp1;
+
+ larno = (unsigned)lookaheads[stateno];
+ fprintf(graph_file, "\n\tq%d [label=\"%d:\\l", stateno, stateno);
+
+ for (isp = itemset; isp < itemsetend; isp++)
+ {
+ sp1 = sp = ritem + *isp;
+
+ while (*sp >= 0)
+ ++sp;
+ rule = -(*sp);
+ fprintf(graph_file, " %s -> ", symbol_pname[rlhs[rule]]);
+
+ for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
+ fprintf(graph_file, "%s ", symbol_pname[*sp]);
+
+ putc('.', graph_file);
+
+ while (*sp >= 0)
+ {
+ fprintf(graph_file, " %s", symbol_pname[*sp]);
+ sp++;
+ }
+
+ if (*sp1 < 0)
+ graph_LA(-*sp1);
+
+ fprintf(graph_file, "\\l");
+ }
+ fprintf(graph_file, "\"];");
+}
+
+static void
+graph_LA(int ruleno)
+{
+ int i;
+ unsigned tokensetsize;
+ unsigned *rowp;
+
+ tokensetsize = (unsigned)WORDSIZE(ntokens);
+
+ if (ruleno == LAruleno[larno])
+ {
+ rowp = LA + larno * tokensetsize;
+
+ fprintf(graph_file, " { ");
+ for (i = ntokens - 1; i >= 0; i--)
+ {
+ if (BIT(rowp, i))
+ fprintf(graph_file, "%s ", symbol_pname[i]);
+ }
+ fprintf(graph_file, "}");
+ ++larno;
+ }
+}
OpenPOWER on IntegriCloud