00001 #include "defs.h"
00002
00003 short *itemset;
00004 short *itemsetend;
00005 unsigned *ruleset;
00006
00007 static unsigned *first_derives;
00008 static unsigned *EFF;
00009
00010
00011 set_EFF()
00012 {
00013 register unsigned *row;
00014 register int symbol;
00015 register short *sp;
00016 register int rowsize;
00017 register int i;
00018 register int rule;
00019
00020 rowsize = WORDSIZE(nvars);
00021 EFF = NEW2(nvars * rowsize, unsigned);
00022
00023 row = EFF;
00024 for (i = start_symbol; i < nsyms; i++)
00025 {
00026 sp = derives[i];
00027 for (rule = *sp; rule > 0; rule = *++sp)
00028 {
00029 symbol = ritem[rrhs[rule]];
00030 if (ISVAR(symbol))
00031 {
00032 symbol -= start_symbol;
00033 SETBIT(row, symbol);
00034 }
00035 }
00036 row += rowsize;
00037 }
00038
00039 reflexive_transitive_closure(EFF, nvars);
00040
00041 #ifdef DEBUG
00042 print_EFF();
00043 #endif
00044 }
00045
00046
00047 set_first_derives()
00048 {
00049 register unsigned *rrow;
00050 register unsigned *vrow;
00051 register int j;
00052 register unsigned k;
00053 register unsigned cword;
00054 register short *rp;
00055
00056 int rule;
00057 int i;
00058 int rulesetsize;
00059 int varsetsize;
00060
00061 rulesetsize = WORDSIZE(nrules);
00062 varsetsize = WORDSIZE(nvars);
00063 first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
00064
00065 set_EFF();
00066
00067 rrow = first_derives + ntokens * rulesetsize;
00068 for (i = start_symbol; i < nsyms; i++)
00069 {
00070 vrow = EFF + ((i - ntokens) * varsetsize);
00071 k = BITS_PER_WORD;
00072 for (j = start_symbol; j < nsyms; k++, j++)
00073 {
00074 if (k >= BITS_PER_WORD)
00075 {
00076 cword = *vrow++;
00077 k = 0;
00078 }
00079
00080 if (cword & (1 << k))
00081 {
00082 rp = derives[j];
00083 while ((rule = *rp++) >= 0)
00084 {
00085 SETBIT(rrow, rule);
00086 }
00087 }
00088 }
00089
00090 vrow += varsetsize;
00091 rrow += rulesetsize;
00092 }
00093
00094 #ifdef DEBUG
00095 print_first_derives();
00096 #endif
00097
00098 FREE(EFF);
00099 }
00100
00101
00102 closure(nucleus, n)
00103 short *nucleus;
00104 int n;
00105 {
00106 register int ruleno;
00107 register unsigned word;
00108 register unsigned i;
00109 register short *csp;
00110 register unsigned *dsp;
00111 register unsigned *rsp;
00112 register int rulesetsize;
00113
00114 short *csend;
00115 unsigned *rsend;
00116 int symbol;
00117 int itemno;
00118
00119 rulesetsize = WORDSIZE(nrules);
00120 rsp = ruleset;
00121 rsend = ruleset + rulesetsize;
00122 for (rsp = ruleset; rsp < rsend; rsp++)
00123 *rsp = 0;
00124
00125 csend = nucleus + n;
00126 for (csp = nucleus; csp < csend; ++csp)
00127 {
00128 symbol = ritem[*csp];
00129 if (ISVAR(symbol))
00130 {
00131 dsp = first_derives + symbol * rulesetsize;
00132 rsp = ruleset;
00133 while (rsp < rsend)
00134 *rsp++ |= *dsp++;
00135 }
00136 }
00137
00138 ruleno = 0;
00139 itemsetend = itemset;
00140 csp = nucleus;
00141 for (rsp = ruleset; rsp < rsend; ++rsp)
00142 {
00143 word = *rsp;
00144 if (word)
00145 {
00146 for (i = 0; i < BITS_PER_WORD; ++i)
00147 {
00148 if (word & (1 << i))
00149 {
00150 itemno = rrhs[ruleno+i];
00151 while (csp < csend && *csp < itemno)
00152 *itemsetend++ = *csp++;
00153 *itemsetend++ = itemno;
00154 while (csp < csend && *csp == itemno)
00155 ++csp;
00156 }
00157 }
00158 }
00159 ruleno += BITS_PER_WORD;
00160 }
00161
00162 while (csp < csend)
00163 *itemsetend++ = *csp++;
00164
00165 #ifdef DEBUG
00166 print_closure(n);
00167 #endif
00168 }
00169
00170
00171
00172 finalize_closure()
00173 {
00174 FREE(itemset);
00175 FREE(ruleset);
00176 FREE(first_derives + ntokens * WORDSIZE(nrules));
00177 }
00178
00179
00180 #ifdef DEBUG
00181
00182 print_closure(n)
00183 int n;
00184 {
00185 register short *isp;
00186
00187 printf("\n\nn = %d\n\n", n);
00188 for (isp = itemset; isp < itemsetend; isp++)
00189 printf(" %d\n", *isp);
00190 }
00191
00192
00193 print_EFF()
00194 {
00195 register int i, j;
00196 register unsigned *rowp;
00197 register unsigned word;
00198 register unsigned k;
00199
00200 printf("\n\nEpsilon Free Firsts\n");
00201
00202 for (i = start_symbol; i < nsyms; i++)
00203 {
00204 printf("\n%s", symbol_name[i]);
00205 rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
00206 word = *rowp++;
00207
00208 k = BITS_PER_WORD;
00209 for (j = 0; j < nvars; k++, j++)
00210 {
00211 if (k >= BITS_PER_WORD)
00212 {
00213 word = *rowp++;
00214 k = 0;
00215 }
00216
00217 if (word & (1 << k))
00218 printf(" %s", symbol_name[start_symbol + j]);
00219 }
00220 }
00221 }
00222
00223
00224 print_first_derives()
00225 {
00226 register int i;
00227 register int j;
00228 register unsigned *rp;
00229 register unsigned cword;
00230 register unsigned k;
00231
00232 printf("\n\n\nFirst Derives\n");
00233
00234 for (i = start_symbol; i < nsyms; i++)
00235 {
00236 printf("\n%s derives\n", symbol_name[i]);
00237 rp = first_derives + i * WORDSIZE(nrules);
00238 k = BITS_PER_WORD;
00239 for (j = 0; j <= nrules; k++, j++)
00240 {
00241 if (k >= BITS_PER_WORD)
00242 {
00243 cword = *rp++;
00244 k = 0;
00245 }
00246
00247 if (cword & (1 << k))
00248 printf(" %d\n", j);
00249 }
00250 }
00251
00252 fflush(stdout);
00253 }
00254
00255 #endif