51 |
|
|
52 |
/* And for the famous F variable, which name is so descriptive that a |
/* And for the famous F variable, which name is so descriptive that a |
53 |
comment is hardly needed. <grin>. */ |
comment is hardly needed. <grin>. */ |
54 |
static unsigned *F = NULL; |
static bitset *F = NULL; |
|
#define F(Rule) (F + (Rule) * tokensetsize) |
|
55 |
|
|
56 |
static short **includes; |
static short **includes; |
57 |
static shorts **lookback; |
static shorts **lookback; |
74 |
traverse (int i) |
traverse (int i) |
75 |
{ |
{ |
76 |
int j; |
int j; |
|
size_t k; |
|
77 |
int height; |
int height; |
|
size_t size = F (i + 1) - F(i); |
|
78 |
|
|
79 |
VERTICES[++top] = i; |
VERTICES[++top] = i; |
80 |
INDEX[i] = height = top; |
INDEX[i] = height = top; |
88 |
if (INDEX[i] > INDEX[R[i][j]]) |
if (INDEX[i] > INDEX[R[i][j]]) |
89 |
INDEX[i] = INDEX[R[i][j]]; |
INDEX[i] = INDEX[R[i][j]]; |
90 |
|
|
91 |
for (k = 0; k < size; ++k) |
bitset_or (F[i], F[i], F[R[i][j]]); |
|
F (i)[k] |= F (R[i][j])[k]; |
|
92 |
} |
} |
93 |
|
|
94 |
if (INDEX[i] == height) |
if (INDEX[i] == height) |
100 |
if (i == j) |
if (i == j) |
101 |
break; |
break; |
102 |
|
|
103 |
for (k = 0; k < size; ++k) |
bitset_copy (F[j], F[i]); |
|
F (j)[k] = F (i)[k]; |
|
104 |
} |
} |
105 |
} |
} |
106 |
|
|
257 |
|
|
258 |
int i; |
int i; |
259 |
|
|
260 |
F = XCALLOC (unsigned, ngotos * tokensetsize); |
F = XCALLOC (bitset, ngotos); |
261 |
|
for (i = 0; i < ngotos; ++i) |
262 |
|
{ |
263 |
|
F[i] = bitset_create (ntokens, BITSET_FIXED); |
264 |
|
bitset_zero (F[i]); |
265 |
|
} |
266 |
|
|
267 |
for (i = 0; i < ngotos; i++) |
for (i = 0; i < ngotos; i++) |
268 |
{ |
{ |
271 |
|
|
272 |
int j; |
int j; |
273 |
for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++) |
for (j = 0; j < sp->nshifts && SHIFT_IS_SHIFT (sp, j); j++) |
274 |
SETBIT (F (i), SHIFT_SYMBOL (sp, j)); |
bitset_set (F[i], SHIFT_SYMBOL (sp, j)); |
275 |
|
|
276 |
for (; j < sp->nshifts; j++) |
for (; j < sp->nshifts; j++) |
277 |
{ |
{ |
500 |
|
|
501 |
for (i = 0; i < nLA; i++) |
for (i = 0; i < nLA; i++) |
502 |
for (sp = lookback[i]; sp; sp = sp->next) |
for (sp = lookback[i]; sp; sp = sp->next) |
503 |
{ |
bitset_or (LA[i], LA[i], F[sp->value]); |
|
int j; |
|
|
for (j = 0; j < ntokens; ++j) |
|
|
if (BITISSET (F (sp->value), j)) |
|
|
bitset_set (LA[i], j); |
|
|
} |
|
504 |
|
|
505 |
/* Free LOOKBACK. */ |
/* Free LOOKBACK. */ |
506 |
for (i = 0; i < nLA; i++) |
for (i = 0; i < nLA; i++) |
507 |
LIST_FREE (shorts, lookback[i]); |
LIST_FREE (shorts, lookback[i]); |
508 |
|
|
509 |
XFREE (lookback); |
XFREE (lookback); |
510 |
|
for (i = 0; i < (unsigned) ngotos; ++i) |
511 |
|
bitset_free (F[i]); |
512 |
XFREE (F); |
XFREE (F); |
513 |
} |
} |
514 |
|
|