#include "system.h"
#include "getargs.h"
+#include "reader.h"
#include "gram.h"
#include "state.h"
#include "complain.h"
static void
allocate_itemsets (void)
{
- short *itemp = NULL;
- int symbol;
int i;
int count;
short *symbol_count = NULL;
count = 0;
symbol_count = XCALLOC (short, nsyms);
- itemp = ritem;
- symbol = *itemp++;
- while (symbol)
- {
- if (symbol > 0)
- {
- count++;
- symbol_count[symbol]++;
- }
- symbol = *itemp++;
- }
+ for (i = 0; ritem[i]; ++i)
+ if (ritem[i] > 0)
+ {
+ count++;
+ symbol_count[ritem[i]]++;
+ }
/* See comments before new_itemsets. All the vectors of items
live inside KERNEL_ITEMS. The number of active items after
int shiftcount;
if (trace_flag)
- fprintf (stderr, "Entering new_itemsets, state = %d\n", nstates);
+ fprintf (stderr, "Entering new_itemsets, state = %d\n",
+ this_state->number);
for (i = 0; i < nsyms; i++)
kernel_end[i] = NULL;
core *p;
if (trace_flag)
- fprintf (stderr, "Entering new_state, state = %d, symbol = %d\n",
- nstates, symbol);
+ fprintf (stderr, "Entering new_state, state = %d, symbol = %d (%s)\n",
+ this_state->number, symbol, tags[symbol]);
if (nstates >= MAXSHORT)
fatal (_("too many states (max %d)"), MAXSHORT);
int n = kernel_end[symbol] - kernel_base[symbol];
if (trace_flag)
- fprintf (stderr, "Entering get_state, state = %d, symbol = %d\n",
- nstates, symbol);
+ fprintf (stderr, "Entering get_state, state = %d, symbol = %d (%s)\n",
+ this_state->number, symbol, tags[symbol]);
/* Add up the target state's active item numbers to get a hash key.
*/
state_table[key] = sp = new_state (symbol);
}
+ if (trace_flag)
+ fprintf (stderr, "Exiting get_state => %d\n", sp->number);
+
return sp->number;
}
int symbol;
if (trace_flag)
- fprintf (stderr, "Entering append_states\n");
-
+ fprintf (stderr, "Entering append_states, state = %d\n",
+ this_state->number);
/* first sort shift_symbol into increasing order */
static unsigned *fderives;
static unsigned *firsts;
+#define FDERIVES(Symbol) (fderives + (Symbol) * rulesetsize)
+#define FIRSTS(Symbol) (firsts + (Symbol) * varsetsize)
+
/* number of words required to hold a bit for each rule */
static int rulesetsize;
{
short *isp;
- fprintf (stderr, "\n\nn = %d\n\n", n);
+ fprintf (stderr, "n = %d\n", n);
for (isp = itemset; isp < itemsetend; isp++)
fprintf (stderr, " %d\n", *isp);
+ fprintf (stderr, "\n\n");
}
int j;
unsigned *rowp;
- fprintf (stderr, "\n\n\nFIRSTS\n\n");
+ fprintf (stderr, "FIRSTS\n");
for (i = ntokens; i < nsyms; i++)
{
- fprintf (stderr, "\n\n%s firsts\n\n", tags[i]);
+ fprintf (stderr, "\t%s firsts\n", tags[i]);
- rowp = firsts + ((i - ntokens) * varsetsize);
+ rowp = FIRSTS (i - ntokens);
for (j = 0; j < nvars; j++)
if (BITISSET (rowp, j))
- fprintf (stderr, " %s\n", tags[j + ntokens]);
+ fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]);
}
+ fprintf (stderr, "\n\n");
}
int j;
unsigned *rp;
- fprintf (stderr, "\n\n\nFDERIVES\n");
+ fprintf (stderr, "FDERIVES\n");
for (i = ntokens; i < nsyms; i++)
{
- fprintf (stderr, "\n\n%s derives\n\n", tags[i]);
- rp = fderives + i * rulesetsize;
+ fprintf (stderr, "\t%s derives\n", tags[i]);
+ rp = FDERIVES (i);
for (j = 0; j <= nrules; j++)
if (BITISSET (rp, j))
- fprintf (stderr, " %d\n", j);
+ fprintf (stderr, "\t\t%d (%s)\n", j, tags[j]);
}
+ fprintf (stderr, "\n\n");
}
\f
/*-------------------------------------------------------------------.
set_firsts ();
- rrow = fderives + ntokens * rulesetsize;
+ rrow = FDERIVES (ntokens);
for (i = ntokens; i < nsyms; i++)
{
- vrow = firsts + ((i - ntokens) * varsetsize);
+ vrow = FIRSTS (i - ntokens);
cword = *vrow++;
b = 0;
for (j = ntokens; j < nsyms; j++)
{
rp = derives[j];
while ((ruleno = *rp++) > 0)
- {
- SETBIT (rrow, ruleno);
- }
+ SETBIT (rrow, ruleno);
}
b++;
int symbol;
int itemno;
+ if (trace_flag)
+ {
+ int i;
+ fprintf (stderr, "Entering closure (items = {");
+ for (i = 0; i < n; ++i)
+ fprintf (stderr, " %d ", core[i]);
+ fprintf (stderr, "}, nitems = %d)\n", n);
+ }
+
rsp = ruleset;
rsend = ruleset + rulesetsize;
csend = core + n;
if (n == 0)
{
- dsp = fderives + start_symbol * rulesetsize;
+ dsp = FDERIVES (start_symbol);
while (rsp < rsend)
*rsp++ = *dsp++;
}
symbol = ritem[*csp++];
if (ISVAR (symbol))
{
- dsp = fderives + symbol * rulesetsize;
+ dsp = FDERIVES (symbol);
rsp = ruleset;
while (rsp < rsend)
*rsp++ |= *dsp++;
int i;
short *sp;
- fputs ("\n\n\nDERIVES\n\n", stderr);
+ fputs ("DERIVES\n", stderr);
for (i = ntokens; i < nsyms; i++)
{
- fprintf (stderr, "%s derives", tags[i]);
+ fprintf (stderr, "\t%s derives\n", tags[i]);
for (sp = derives[i]; *sp > 0; sp++)
- fprintf (stderr, " %d", *sp);
- putc ('\n', stderr);
+ fprintf (stderr, "\t\t%d (%s)\n", *sp, tags[*sp]);
}
- putc ('\n', stderr);
+ fputs ("\n\n", stderr);
}