36 |
static unsigned *fderives; |
static unsigned *fderives; |
37 |
static unsigned *firsts; |
static unsigned *firsts; |
38 |
|
|
39 |
#define FDERIVES(Symbol) (fderives + (Symbol) * rulesetsize) |
/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var. */ |
40 |
#define FIRSTS(Symbol) (firsts + (Symbol) * varsetsize) |
#define FDERIVES(Var) (fderives + ((Var) - ntokens) * rulesetsize) |
41 |
|
#define FIRSTS(Var) (firsts + ((Var) - ntokens) * varsetsize) |
42 |
|
|
43 |
/* number of words required to hold a bit for each rule */ |
/* number of words required to hold a bit for each rule */ |
44 |
static int rulesetsize; |
static int rulesetsize; |
72 |
{ |
{ |
73 |
fprintf (stderr, "\t%s firsts\n", tags[i]); |
fprintf (stderr, "\t%s firsts\n", tags[i]); |
74 |
for (j = 0; j < nvars; j++) |
for (j = 0; j < nvars; j++) |
75 |
if (BITISSET (FIRSTS (i - ntokens), j)) |
if (BITISSET (FIRSTS (i), j)) |
76 |
fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]); |
fprintf (stderr, "\t\t%d (%s)\n", j + ntokens, tags[j + ntokens]); |
77 |
} |
} |
78 |
fprintf (stderr, "\n\n"); |
fprintf (stderr, "\n\n"); |
116 |
static void |
static void |
117 |
set_firsts (void) |
set_firsts (void) |
118 |
{ |
{ |
|
int rowsize; |
|
|
|
|
119 |
int i, j; |
int i, j; |
120 |
|
|
121 |
varsetsize = rowsize = WORDSIZE (nvars); |
varsetsize = WORDSIZE (nvars); |
122 |
|
|
123 |
firsts = XCALLOC (unsigned, nvars * rowsize); |
firsts = XCALLOC (unsigned, nvars * varsetsize); |
124 |
|
|
125 |
for (i = ntokens; i < nsyms; i++) |
for (i = ntokens; i < nsyms; i++) |
126 |
for (j = 0; derives[i][j] >= 0; ++j) |
for (j = 0; derives[i][j] >= 0; ++j) |
127 |
{ |
{ |
128 |
int symbol = ritem[rule_table[derives[i][j]].rhs]; |
int symbol = ritem[rule_table[derives[i][j]].rhs]; |
129 |
if (ISVAR (symbol)) |
if (ISVAR (symbol)) |
130 |
SETBIT (FIRSTS (i - ntokens), symbol - ntokens); |
SETBIT (FIRSTS (i), symbol - ntokens); |
131 |
} |
} |
132 |
|
|
133 |
RTC (firsts, nvars); |
RTC (firsts, nvars); |
151 |
{ |
{ |
152 |
int i, j, k; |
int i, j, k; |
153 |
|
|
154 |
fderives = XCALLOC (unsigned, nvars * rulesetsize) - ntokens * rulesetsize; |
fderives = XCALLOC (unsigned, nvars * rulesetsize); |
155 |
|
|
156 |
set_firsts (); |
set_firsts (); |
157 |
|
|
158 |
for (i = ntokens; i < nsyms; ++i) |
for (i = ntokens; i < nsyms; ++i) |
159 |
for (j = ntokens; j < nsyms; ++j) |
for (j = ntokens; j < nsyms; ++j) |
160 |
if (BITISSET (FIRSTS (i - ntokens), j - ntokens)) |
if (BITISSET (FIRSTS (i), j - ntokens)) |
161 |
for (k = 0; derives[j][k] > 0; ++k) |
for (k = 0; derives[j][k] > 0; ++k) |
162 |
SETBIT (FDERIVES (i), derives[j][k]); |
SETBIT (FDERIVES (i), derives[j][k]); |
163 |
|
|
250 |
{ |
{ |
251 |
XFREE (itemset); |
XFREE (itemset); |
252 |
XFREE (ruleset); |
XFREE (ruleset); |
253 |
XFREE (fderives + ntokens * rulesetsize); |
XFREE (fderives); |
254 |
} |
} |