26 |
#include "derives.h" |
#include "derives.h" |
27 |
#include "warshall.h" |
#include "warshall.h" |
28 |
|
|
29 |
|
/* ITEMSETSIZE is the size of the array ITEMSET. */ |
30 |
short *itemset; |
short *itemset; |
31 |
short *itemsetend; |
size_t itemsetsize; |
32 |
|
|
33 |
static unsigned *ruleset; |
static unsigned *ruleset; |
34 |
|
|
35 |
/* internal data. See comments before set_fderives and set_firsts. */ |
/* internal data. See comments before set_fderives and set_firsts. */ |
53 |
static void |
static void |
54 |
print_closure (int n) |
print_closure (int n) |
55 |
{ |
{ |
56 |
short *isp; |
int i; |
|
|
|
57 |
fprintf (stderr, "n = %d\n", n); |
fprintf (stderr, "n = %d\n", n); |
58 |
for (isp = itemset; isp < itemsetend; isp++) |
for (i = 0; i < itemsetsize; ++i) |
59 |
fprintf (stderr, " %d\n", *isp); |
fprintf (stderr, " %d\n", itemset[i]); |
60 |
fprintf (stderr, "\n\n"); |
fprintf (stderr, "\n\n"); |
61 |
} |
} |
62 |
|
|
266 |
} |
} |
267 |
|
|
268 |
ruleno = 0; |
ruleno = 0; |
269 |
itemsetend = itemset; |
itemsetsize = 0; |
270 |
csp = core; |
csp = core; |
271 |
for (i= 0; i < rulesetsize; ++i) |
for (i = 0; i < rulesetsize; ++i) |
272 |
{ |
{ |
273 |
int word = ruleset[i]; |
int word = ruleset[i]; |
274 |
if (word == 0) |
if (word == 0) |
284 |
if (word & (1 << b)) |
if (word & (1 << b)) |
285 |
{ |
{ |
286 |
itemno = rule_table[ruleno].rhs; |
itemno = rule_table[ruleno].rhs; |
287 |
while (csp < (core + n ) && *csp < itemno) |
while (csp < (core + n) && *csp < itemno) |
288 |
*itemsetend++ = *csp++; |
itemset[itemsetsize++] = *csp++; |
289 |
*itemsetend++ = itemno; |
itemset[itemsetsize++] = itemno; |
290 |
} |
} |
291 |
|
|
292 |
ruleno++; |
ruleno++; |
295 |
} |
} |
296 |
|
|
297 |
while (csp < (core + n)) |
while (csp < (core + n)) |
298 |
*itemsetend++ = *csp++; |
itemset[itemsetsize++] = *csp++; |
299 |
|
|
300 |
if (trace_flag) |
if (trace_flag) |
301 |
print_closure (n); |
print_closure (n); |