7 static unsigned *first_derives;
13 register unsigned *row;
20 rowsize = WORDSIZE(nvars);
21 EFF = NEW2(nvars * rowsize, unsigned);
24 for (i = start_symbol; i < nsyms; i++)
27 for (rule = *sp; rule > 0; rule = *++sp)
29 symbol = ritem[rrhs[rule]];
32 symbol -= start_symbol;
39 reflexive_transitive_closure(EFF, nvars);
49 register unsigned *rrow;
50 register unsigned *vrow;
52 register unsigned mask;
53 register unsigned cword;
61 rulesetsize = WORDSIZE(nrules);
62 varsetsize = WORDSIZE(nvars);
63 first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
67 rrow = first_derives + ntokens * rulesetsize;
68 for (i = start_symbol; i < nsyms; i++)
70 vrow = EFF + ((i - ntokens) * varsetsize);
73 for (j = start_symbol; j < nsyms; j++)
78 while ((rule = *rp++) >= 0)
97 print_first_derives();
109 register unsigned word;
110 register unsigned mask;
112 register unsigned *dsp;
113 register unsigned *rsp;
114 register int rulesetsize;
121 rulesetsize = WORDSIZE(nrules);
123 rsend = ruleset + rulesetsize;
124 for (rsp = ruleset; rsp < rsend; rsp++)
128 for (csp = nucleus; csp < csend; ++csp)
130 symbol = ritem[*csp];
133 dsp = first_derives + symbol * rulesetsize;
141 itemsetend = itemset;
143 for (rsp = ruleset; rsp < rsend; ++rsp)
147 ruleno += BITS_PER_WORD;
155 itemno = rrhs[ruleno];
156 while (csp < csend && *csp < itemno)
157 *itemsetend++ = *csp++;
158 *itemsetend++ = itemno;
159 while (csp < csend && *csp == itemno)
170 *itemsetend++ = *csp++;
183 FREE(first_derives + ntokens * WORDSIZE(nrules));
194 printf("\n\nn = %d\n\n", n);
195 for (isp = itemset; isp < itemsetend; isp++)
196 printf(" %d\n", *isp);
202 register int i, j, k;
203 register unsigned *rowp;
204 register unsigned word;
205 register unsigned mask;
207 printf("\n\nEpsilon Free Firsts\n");
209 for (i = start_symbol; i < nsyms; i++)
211 printf("\n%s", symbol_name[i]);
212 rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
216 for (j = 0; j < nvars; j++)
219 printf(" %s", symbol_name[start_symbol + j]);
232 print_first_derives()
236 register unsigned *rp;
237 register unsigned cword;
238 register unsigned mask;
240 printf("\n\n\nFirst Derives\n");
242 for (i = start_symbol; i < nsyms; i++)
244 printf("\n%s derives\n", symbol_name[i]);
245 rp = first_derives + i * WORDSIZE(nrules);
248 for (j = 0; j <= nrules; j++)