Annotation of GNUtools/bison/closure.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.