124 |
static void |
static void |
125 |
set_firsts (void) |
set_firsts (void) |
126 |
{ |
{ |
|
unsigned *row; |
|
|
int symbol; |
|
|
short *sp; |
|
127 |
int rowsize; |
int rowsize; |
128 |
|
|
129 |
int i; |
int i, j; |
130 |
|
|
131 |
varsetsize = rowsize = WORDSIZE (nvars); |
varsetsize = rowsize = WORDSIZE (nvars); |
132 |
|
|
133 |
firsts = XCALLOC (unsigned, nvars * rowsize); |
firsts = XCALLOC (unsigned, nvars * rowsize); |
134 |
|
|
|
row = firsts; |
|
135 |
for (i = ntokens; i < nsyms; i++) |
for (i = ntokens; i < nsyms; i++) |
136 |
{ |
for (j = 0; derives[i][j] >= 0; ++j) |
137 |
sp = derives[i]; |
{ |
138 |
while (*sp >= 0) |
int symbol = ritem[rule_table[derives[i][j]].rhs]; |
139 |
{ |
if (ISVAR (symbol)) |
140 |
symbol = ritem[rule_table[*sp++].rhs]; |
{ |
141 |
if (ISVAR (symbol)) |
symbol -= ntokens; |
142 |
{ |
SETBIT (FIRSTS (i - ntokens), symbol); |
143 |
symbol -= ntokens; |
} |
144 |
SETBIT (row, symbol); |
} |
|
} |
|
|
} |
|
|
|
|
|
row += rowsize; |
|
|
} |
|
145 |
|
|
146 |
RTC (firsts, nvars); |
RTC (firsts, nvars); |
147 |
|
|