1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/* $Id: graph.c,v 1.4 2005/05/04 20:58:38 tom Exp $ */
#include "defs.h"
static void graph_state(int stateno);
static void graph_LA(int ruleno);
static unsigned int larno;
void graph(void)
{
register int i;
register int j;
register shifts *sp;
register int sn;
register 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)
{
register short *isp;
register int rule;
register short *sp;
register short *sp1;
larno = 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)
{
register int i;
register int tokensetsize;
register unsigned *rowp;
tokensetsize = 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;
}
}
|