128 |
{ |
{ |
129 |
int symbol = ritem[rule_table[derives[i][j]].rhs]; |
int symbol = ritem[rule_table[derives[i][j]].rhs]; |
130 |
if (ISVAR (symbol)) |
if (ISVAR (symbol)) |
131 |
{ |
SETBIT (FIRSTS (i - ntokens), symbol - ntokens); |
|
symbol -= ntokens; |
|
|
SETBIT (FIRSTS (i - ntokens), symbol); |
|
|
} |
|
132 |
} |
} |
133 |
|
|
134 |
RTC (firsts, nvars); |
RTC (firsts, nvars); |
150 |
static void |
static void |
151 |
set_fderives (void) |
set_fderives (void) |
152 |
{ |
{ |
153 |
unsigned *rrow; |
int i, j, k; |
|
unsigned *vrow; |
|
|
int j; |
|
|
unsigned cword; |
|
|
short *rp; |
|
|
int b; |
|
|
|
|
|
int ruleno; |
|
|
int i; |
|
154 |
|
|
155 |
fderives = XCALLOC (unsigned, nvars * rulesetsize) - ntokens * rulesetsize; |
fderives = XCALLOC (unsigned, nvars * rulesetsize) - ntokens * rulesetsize; |
156 |
|
|
157 |
set_firsts (); |
set_firsts (); |
158 |
|
|
159 |
rrow = FDERIVES (ntokens); |
for (i = ntokens; i < nsyms; ++i) |
160 |
|
for (j = ntokens; j < nsyms; ++j) |
161 |
for (i = ntokens; i < nsyms; i++) |
if (BITISSET (FIRSTS (i - ntokens), j - ntokens)) |
162 |
{ |
for (k = 0; derives[j][k] > 0; ++k) |
163 |
vrow = FIRSTS (i - ntokens); |
SETBIT (FDERIVES (i), derives[j][k]); |
|
cword = *vrow++; |
|
|
b = 0; |
|
|
for (j = ntokens; j < nsyms; j++) |
|
|
{ |
|
|
if (cword & (1 << b)) |
|
|
{ |
|
|
rp = derives[j]; |
|
|
while ((ruleno = *rp++) > 0) |
|
|
SETBIT (rrow, ruleno); |
|
|
} |
|
|
|
|
|
b++; |
|
|
if (b >= BITS_PER_WORD && j + 1 < nsyms) |
|
|
{ |
|
|
cword = *vrow++; |
|
|
b = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
rrow += rulesetsize; |
|
|
} |
|
164 |
|
|
165 |
if (trace_flag) |
if (trace_flag) |
166 |
print_fderives (); |
print_fderives (); |