|
|
1.1 ! root 1: /* Subroutines for bison ! 2: Copyright (C) 1984, 1989 Free Software Foundation, Inc. ! 3: ! 4: This file is part of Bison, the GNU Compiler Compiler. ! 5: ! 6: Bison is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: Bison is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with Bison; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: /* subroutines of file LR0.c. ! 22: ! 23: Entry points: ! 24: ! 25: closure (items, n) ! 26: ! 27: Given a vector of item numbers items, of length n, ! 28: set up ruleset and itemset to indicate what rules could be run ! 29: and which items could be accepted when those items are the active ones. ! 30: ! 31: ruleset contains a bit for each rule. closure sets the bits ! 32: for all rules which could potentially describe the next input to be read. ! 33: ! 34: itemset is a vector of item numbers; itemsetend points to just beyond the end ! 35: of the part of it that is significant. ! 36: closure places there the indices of all items which represent units of ! 37: input that could arrive next. ! 38: ! 39: initialize_closure (n) ! 40: ! 41: Allocates the itemset and ruleset vectors, ! 42: and precomputes useful data so that closure can be called. ! 43: n is the number of elements to allocate for itemset. ! 44: ! 45: finalize_closure () ! 46: ! 47: Frees itemset, ruleset and internal data. ! 48: ! 49: */ ! 50: ! 51: #include <stdio.h> ! 52: #include "system.h" ! 53: #include "machine.h" ! 54: #include "new.h" ! 55: #include "gram.h" ! 56: ! 57: ! 58: extern short **derives; ! 59: extern char **tags; ! 60: ! 61: void set_fderives(); ! 62: void set_firsts(); ! 63: ! 64: extern void RTC(); ! 65: ! 66: short *itemset; ! 67: short *itemsetend; ! 68: static unsigned *ruleset; ! 69: ! 70: /* internal data. See comments before set_fderives and set_firsts. */ ! 71: static unsigned *fderives; ! 72: static unsigned *firsts; ! 73: ! 74: /* number of words required to hold a bit for each rule */ ! 75: static int rulesetsize; ! 76: ! 77: /* number of words required to hold a bit for each variable */ ! 78: static int varsetsize; ! 79: ! 80: ! 81: void ! 82: initialize_closure(n) ! 83: int n; ! 84: { ! 85: itemset = NEW2(n, short); ! 86: ! 87: rulesetsize = WORDSIZE(nrules + 1); ! 88: ruleset = NEW2(rulesetsize, unsigned); ! 89: ! 90: set_fderives(); ! 91: } ! 92: ! 93: ! 94: ! 95: /* set fderives to an nvars by nrules matrix of bits ! 96: indicating which rules can help derive the beginning of the data ! 97: for each nonterminal. For example, if symbol 5 can be derived as ! 98: the sequence of symbols 8 3 20, and one of the rules for deriving ! 99: symbol 8 is rule 4, then the [5 - ntokens, 4] bit in fderives is set. */ ! 100: void ! 101: set_fderives() ! 102: { ! 103: register unsigned *rrow; ! 104: register unsigned *vrow; ! 105: register int j; ! 106: register unsigned cword; ! 107: register short *rp; ! 108: register int b; ! 109: ! 110: int ruleno; ! 111: int i; ! 112: ! 113: fderives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize; ! 114: ! 115: set_firsts(); ! 116: ! 117: rrow = fderives + ntokens * rulesetsize; ! 118: ! 119: for (i = ntokens; i < nsyms; i++) ! 120: { ! 121: vrow = firsts + ((i - ntokens) * varsetsize); ! 122: cword = *vrow++; ! 123: b = 0; ! 124: for (j = ntokens; j < nsyms; j++) ! 125: { ! 126: if (cword & (1 << b)) ! 127: { ! 128: rp = derives[j]; ! 129: while ((ruleno = *rp++) > 0) ! 130: { ! 131: SETBIT(rrow, ruleno); ! 132: } ! 133: } ! 134: ! 135: b++; ! 136: if (b >= BITS_PER_WORD && j + 1 < nsyms) ! 137: { ! 138: cword = *vrow++; ! 139: b = 0; ! 140: } ! 141: } ! 142: ! 143: rrow += rulesetsize; ! 144: } ! 145: ! 146: #ifdef DEBUG ! 147: print_fderives(); ! 148: #endif ! 149: ! 150: FREE(firsts); ! 151: } ! 152: ! 153: ! 154: ! 155: /* set firsts to be an nvars by nvars bit matrix indicating which items ! 156: can represent the beginning of the input corresponding to which other items. ! 157: For example, if some rule expands symbol 5 into the sequence of symbols 8 3 20, ! 158: the symbol 8 can be the beginning of the data for symbol 5, ! 159: so the bit [8 - ntokens, 5 - ntokens] in firsts is set. */ ! 160: void ! 161: set_firsts() ! 162: { ! 163: register unsigned *row; ! 164: /* register int done; JF unused */ ! 165: register int symbol; ! 166: register short *sp; ! 167: register int rowsize; ! 168: ! 169: int i; ! 170: ! 171: varsetsize = rowsize = WORDSIZE(nvars); ! 172: ! 173: firsts = NEW2(nvars * rowsize, unsigned); ! 174: ! 175: row = firsts; ! 176: for (i = ntokens; i < nsyms; i++) ! 177: { ! 178: sp = derives[i]; ! 179: while (*sp >= 0) ! 180: { ! 181: symbol = ritem[rrhs[*sp++]]; ! 182: if (ISVAR(symbol)) ! 183: { ! 184: symbol -= ntokens; ! 185: SETBIT(row, symbol); ! 186: } ! 187: } ! 188: ! 189: row += rowsize; ! 190: } ! 191: ! 192: RTC(firsts, nvars); ! 193: ! 194: #ifdef DEBUG ! 195: print_firsts(); ! 196: #endif ! 197: } ! 198: ! 199: ! 200: void ! 201: closure(core, n) ! 202: short *core; ! 203: int n; ! 204: { ! 205: register int ruleno; ! 206: register unsigned word; ! 207: register short *csp; ! 208: register unsigned *dsp; ! 209: register unsigned *rsp; ! 210: ! 211: short *csend; ! 212: unsigned *rsend; ! 213: int symbol; ! 214: int itemno; ! 215: ! 216: rsp = ruleset; ! 217: rsend = ruleset + rulesetsize; ! 218: csend = core + n; ! 219: ! 220: if (n == 0) ! 221: { ! 222: dsp = fderives + start_symbol * rulesetsize; ! 223: while (rsp < rsend) ! 224: *rsp++ = *dsp++; ! 225: } ! 226: else ! 227: { ! 228: while (rsp < rsend) ! 229: *rsp++ = 0; ! 230: ! 231: csp = core; ! 232: while (csp < csend) ! 233: { ! 234: symbol = ritem[*csp++]; ! 235: if (ISVAR(symbol)) ! 236: { ! 237: dsp = fderives + symbol * rulesetsize; ! 238: rsp = ruleset; ! 239: while (rsp < rsend) ! 240: *rsp++ |= *dsp++; ! 241: } ! 242: } ! 243: } ! 244: ! 245: ruleno = 0; ! 246: itemsetend = itemset; ! 247: csp = core; ! 248: rsp = ruleset; ! 249: while (rsp < rsend) ! 250: { ! 251: word = *rsp++; ! 252: if (word == 0) ! 253: { ! 254: ruleno += BITS_PER_WORD; ! 255: } ! 256: else ! 257: { ! 258: register int b; ! 259: ! 260: for (b = 0; b < BITS_PER_WORD; b++) ! 261: { ! 262: if (word & (1 << b)) ! 263: { ! 264: itemno = rrhs[ruleno]; ! 265: while (csp < csend && *csp < itemno) ! 266: *itemsetend++ = *csp++; ! 267: *itemsetend++ = itemno; ! 268: } ! 269: ! 270: ruleno++; ! 271: } ! 272: } ! 273: } ! 274: ! 275: while (csp < csend) ! 276: *itemsetend++ = *csp++; ! 277: ! 278: #ifdef DEBUG ! 279: print_closure(n); ! 280: #endif ! 281: } ! 282: ! 283: ! 284: void ! 285: finalize_closure() ! 286: { ! 287: FREE(itemset); ! 288: FREE(ruleset); ! 289: FREE(fderives + ntokens * rulesetsize); ! 290: } ! 291: ! 292: ! 293: ! 294: #ifdef DEBUG ! 295: ! 296: print_closure(n) ! 297: int n; ! 298: { ! 299: register short *isp; ! 300: ! 301: printf("\n\nn = %d\n\n", n); ! 302: for (isp = itemset; isp < itemsetend; isp++) ! 303: printf(" %d\n", *isp); ! 304: } ! 305: ! 306: ! 307: ! 308: print_firsts() ! 309: { ! 310: register int i; ! 311: register int j; ! 312: register unsigned *rowp; ! 313: ! 314: printf("\n\n\nFIRSTS\n\n"); ! 315: ! 316: for (i = ntokens; i < nsyms; i++) ! 317: { ! 318: printf("\n\n%s firsts\n\n", tags[i]); ! 319: ! 320: rowp = firsts + ((i - ntokens) * varsetsize); ! 321: ! 322: for (j = 0; j < nvars; j++) ! 323: if (BITISSET (rowp, j)) ! 324: printf(" %s\n", tags[j + ntokens]); ! 325: } ! 326: } ! 327: ! 328: ! 329: ! 330: print_fderives() ! 331: { ! 332: register int i; ! 333: register int j; ! 334: register unsigned *rp; ! 335: ! 336: printf("\n\n\nFDERIVES\n"); ! 337: ! 338: for (i = ntokens; i < nsyms; i++) ! 339: { ! 340: printf("\n\n%s derives\n\n", tags[i]); ! 341: rp = fderives + i * rulesetsize; ! 342: ! 343: for (j = 0; j <= nrules; j++) ! 344: if (BITISSET (rp, j)) ! 345: printf(" %d\n", j); ! 346: } ! 347: ! 348: fflush(stdout); ! 349: } ! 350: ! 351: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.