Annotation of 43BSDReno/pgrm/yacc/lr0.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1989 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Robert Paul Corbett.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted provided
                      9:  * that: (1) source distributions retain this entire copyright notice and
                     10:  * comment, and (2) distributions including binaries display the following
                     11:  * acknowledgement:  ``This product includes software developed by the
                     12:  * University of California, Berkeley and its contributors'' in the
                     13:  * documentation or other materials provided with the distribution and in
                     14:  * all advertising materials mentioning features or use of this software.
                     15:  * Neither the name of the University nor the names of its contributors may
                     16:  * be used to endorse or promote products derived from this software without
                     17:  * specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     19:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     20:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #ifndef lint
                     24: static char sccsid[] = "@(#)lr0.c      5.2 (Berkeley) 6/1/90";
                     25: #endif /* not lint */
                     26: 
                     27: #include "defs.h"
                     28: 
                     29: extern short *itemset;
                     30: extern short *itemsetend;
                     31: extern unsigned *ruleset;
                     32: 
                     33: int nstates;
                     34: core *first_state;
                     35: shifts *first_shift;
                     36: reductions *first_reduction;
                     37: 
                     38: int get_state();
                     39: core *new_state();
                     40: 
                     41: static core *this_state;
                     42: static core *last_state;
                     43: static shifts *last_shift;
                     44: static reductions *last_reduction;
                     45: 
                     46: static int nshifts;
                     47: static short *shift_symbol;
                     48: 
                     49: static short *redset;
                     50: static short *shiftset;
                     51: 
                     52: static short **kernel_base;
                     53: static short **kernel_end;
                     54: static short *kernel_items;
                     55: 
                     56: static core **state_table;
                     57: 
                     58: 
                     59: allocate_itemsets()
                     60: {
                     61:   register short *itemp;
                     62:   register short *item_end;
                     63:   register int symbol;
                     64:   register int i;
                     65:   register int count;
                     66:   register int max;
                     67:   register short *symbol_count;
                     68: 
                     69:   count = 0;
                     70:   symbol_count = NEW2(nsyms, short);
                     71: 
                     72:   item_end = ritem + nitems;
                     73:   for (itemp = ritem; itemp < item_end; itemp++)
                     74:     {
                     75:       symbol = *itemp;
                     76:       if (symbol >= 0)
                     77:        {
                     78:          count++;
                     79:          symbol_count[symbol]++;
                     80:        }
                     81:     }
                     82: 
                     83:   kernel_base = NEW2(nsyms, short *);
                     84:   kernel_items = NEW2(count, short);
                     85: 
                     86:   count = 0;
                     87:   max = 0;
                     88:   for (i = 0; i < nsyms; i++)
                     89:     {
                     90:       kernel_base[i] = kernel_items + count;
                     91:       count += symbol_count[i];
                     92:       if (max < symbol_count[i])
                     93:        max = symbol_count[i];
                     94:     }
                     95: 
                     96:   shift_symbol = symbol_count;
                     97:   kernel_end = NEW2(nsyms, short *);
                     98: }
                     99: 
                    100: 
                    101: 
                    102: allocate_storage()
                    103: {
                    104:   allocate_itemsets();
                    105: 
                    106:   shiftset = NEW2(nsyms, short);
                    107:   redset = NEW2(nrules + 1, short);
                    108:   state_table = NEW2(nitems, core *);
                    109: }
                    110: 
                    111: 
                    112: 
                    113: append_states()
                    114: {
                    115:   register int i;
                    116:   register int j;
                    117:   register int symbol;
                    118: 
                    119: #ifdef TRACE
                    120:   fprintf(stderr, "Entering append_states\n");
                    121: #endif
                    122: 
                    123:   for (i = 1; i < nshifts; i++)
                    124:     {
                    125:       symbol = shift_symbol[i];
                    126:       j = i;
                    127:       while (j > 0 && shift_symbol[j - 1] > symbol)
                    128:        {
                    129:          shift_symbol[j] = shift_symbol[j - 1];
                    130:          j--;
                    131:        }
                    132:       shift_symbol[j] = symbol;
                    133:     }
                    134: 
                    135:   for (i = 0; i < nshifts; i++)
                    136:     {
                    137:       symbol = shift_symbol[i];
                    138:       shiftset[i] = get_state(symbol);
                    139:     }
                    140: }
                    141: 
                    142: 
                    143: free_storage()
                    144: {
                    145:   FREE(shift_symbol);
                    146:   FREE(redset);
                    147:   FREE(shiftset);
                    148:   FREE(kernel_base);
                    149:   FREE(kernel_end);
                    150:   FREE(kernel_items);
                    151:   FREE(state_table);
                    152: }
                    153: 
                    154: 
                    155: 
                    156: generate_states()
                    157: {
                    158:   allocate_storage();
                    159:   itemset = NEW2(nitems, short);
                    160:   ruleset = NEW2(WORDSIZE(nrules), unsigned);
                    161:   set_first_derives();
                    162:   initialize_states();
                    163: 
                    164:   while (this_state)
                    165:     {
                    166:       closure(this_state->items, this_state->nitems);
                    167:       save_reductions();
                    168:       new_itemsets();
                    169:       append_states();
                    170: 
                    171:       if (nshifts > 0)
                    172:         save_shifts();
                    173: 
                    174:       this_state = this_state->next;
                    175:     }
                    176: 
                    177:   finalize_closure();
                    178:   free_storage();
                    179: }
                    180: 
                    181: 
                    182: 
                    183: int
                    184: get_state(symbol)
                    185: int symbol;
                    186: {
                    187:   register int key;
                    188:   register short *isp1;
                    189:   register short *isp2;
                    190:   register short *iend;
                    191:   register core *sp;
                    192:   register int found;
                    193: 
                    194:   int n;
                    195: 
                    196: #ifdef TRACE
                    197:   fprintf(stderr, "Entering get_state, symbol = %d\n", symbol);
                    198: #endif
                    199: 
                    200:   isp1 = kernel_base[symbol];
                    201:   iend = kernel_end[symbol];
                    202:   n = iend - isp1;
                    203: 
                    204:   key = *isp1;
                    205:   assert(0 <= key && key < nitems);
                    206:   sp = state_table[key];
                    207:   if (sp)
                    208:     {
                    209:       found = 0;
                    210:       while (!found)
                    211:        {
                    212:          if (sp->nitems == n)
                    213:            {
                    214:              found = 1;
                    215:              isp1 = kernel_base[symbol];
                    216:              isp2 = sp->items;
                    217: 
                    218:              while (found && isp1 < iend)
                    219:                {
                    220:                  if (*isp1++ != *isp2++)
                    221:                    found = 0;
                    222:                }
                    223:            }
                    224: 
                    225:          if (!found)
                    226:            {
                    227:              if (sp->link)
                    228:                {
                    229:                  sp = sp->link;
                    230:                }
                    231:              else
                    232:                {
                    233:                  sp = sp->link = new_state(symbol);
                    234:                  found = 1;
                    235:                }
                    236:            }
                    237:        }
                    238:     }
                    239:   else
                    240:     {
                    241:       state_table[key] = sp = new_state(symbol);
                    242:     }
                    243: 
                    244:   return (sp->number);
                    245: }
                    246: 
                    247: 
                    248: 
                    249: initialize_states()
                    250: {
                    251:     register int i;
                    252:     register short *start_derives;
                    253:     register core *p;
                    254: 
                    255:     start_derives = derives[start_symbol];
                    256:     for (i = 0; start_derives[i] >= 0; ++i)
                    257:        continue;
                    258: 
                    259:     p = (core *) MALLOC(sizeof(core) + i*sizeof(short));
                    260:     if (p == 0) no_space();
                    261: 
                    262:     p->next = 0;
                    263:     p->link = 0;
                    264:     p->number = 0;
                    265:     p->accessing_symbol = 0;
                    266:     p->nitems = i;
                    267: 
                    268:     for (i = 0;  start_derives[i] >= 0; ++i)
                    269:        p->items[i] = rrhs[start_derives[i]];
                    270: 
                    271:     first_state = last_state = this_state = p;
                    272:     nstates = 1;
                    273: }
                    274: 
                    275: 
                    276: new_itemsets()
                    277: {
                    278:   register int i;
                    279:   register int shiftcount;
                    280:   register short *isp;
                    281:   register short *ksp;
                    282:   register int symbol;
                    283: 
                    284:   for (i = 0; i < nsyms; i++)
                    285:     kernel_end[i] = 0;
                    286: 
                    287:   shiftcount = 0;
                    288:   isp = itemset;
                    289:   while (isp < itemsetend)
                    290:     {
                    291:       i = *isp++;
                    292:       symbol = ritem[i];
                    293:       if (symbol > 0)
                    294:        {
                    295:           ksp = kernel_end[symbol];
                    296: 
                    297:           if (!ksp)
                    298:            {
                    299:              shift_symbol[shiftcount++] = symbol;
                    300:              ksp = kernel_base[symbol];
                    301:            }
                    302: 
                    303:           *ksp++ = i + 1;
                    304:           kernel_end[symbol] = ksp;
                    305:        }
                    306:     }
                    307: 
                    308:   nshifts = shiftcount;
                    309: }
                    310: 
                    311: 
                    312: 
                    313: core *
                    314: new_state(symbol)
                    315: int symbol;
                    316: {
                    317:   register int n;
                    318:   register core *p;
                    319:   register short *isp1;
                    320:   register short *isp2;
                    321:   register short *iend;
                    322: 
                    323: #ifdef TRACE
                    324:   fprintf(stderr, "Entering new_state, symbol = %d\n", symbol);
                    325: #endif
                    326: 
                    327:   if (nstates >= MAXSHORT)
                    328:     fatal("too many states");
                    329: 
                    330:   isp1 = kernel_base[symbol];
                    331:   iend = kernel_end[symbol];
                    332:   n = iend - isp1;
                    333: 
                    334:   p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short)));
                    335:   p->accessing_symbol = symbol;
                    336:   p->number = nstates;
                    337:   p->nitems = n;
                    338: 
                    339:   isp2 = p->items;
                    340:   while (isp1 < iend)
                    341:     *isp2++ = *isp1++;
                    342: 
                    343:   last_state->next = p;
                    344:   last_state = p;
                    345: 
                    346:   nstates++;
                    347: 
                    348:   return (p);
                    349: }
                    350: 
                    351: 
                    352: /* show_cores is used for debugging */
                    353: 
                    354: show_cores()
                    355: {
                    356:     core *p;
                    357:     int i, j, k, n;
                    358:     int itemno;
                    359: 
                    360:     k = 0;
                    361:     for (p = first_state; p; ++k, p = p->next)
                    362:     {
                    363:        if (k) printf("\n");
                    364:        printf("state %d, number = %d, accessing symbol = %s\n",
                    365:                k, p->number, symbol_name[p->accessing_symbol]);
                    366:        n = p->nitems;
                    367:        for (i = 0; i < n; ++i)
                    368:        {
                    369:            itemno = p->items[i];
                    370:            printf("%4d  ", itemno);
                    371:            j = itemno;
                    372:            while (ritem[j] >= 0) ++j;
                    373:            printf("%s :", symbol_name[rlhs[-ritem[j]]]);
                    374:            j = rrhs[-ritem[j]];
                    375:            while (j < itemno)
                    376:                printf(" %s", symbol_name[ritem[j++]]);
                    377:            printf(" .");
                    378:            while (ritem[j] >= 0)
                    379:                printf(" %s", symbol_name[ritem[j++]]);
                    380:            printf("\n");
                    381:            fflush(stdout);
                    382:        }
                    383:     }
                    384: }
                    385: 
                    386: 
                    387: /* show_ritems is used for debugging */
                    388: 
                    389: show_ritems()
                    390: {
                    391:     int i;
                    392: 
                    393:     for (i = 0; i < nitems; ++i)
                    394:        printf("ritem[%d] = %d\n", i, ritem[i]);
                    395: }
                    396: 
                    397: 
                    398: /* show_rrhs is used for debugging */
                    399: show_rrhs()
                    400: {
                    401:     int i;
                    402: 
                    403:     for (i = 0; i < nrules; ++i)
                    404:        printf("rrhs[%d] = %d\n", i, rrhs[i]);
                    405: }
                    406: 
                    407: 
                    408: /* show_shifts is used for debugging */
                    409: 
                    410: show_shifts()
                    411: {
                    412:     shifts *p;
                    413:     int i, j, k;
                    414: 
                    415:     k = 0;
                    416:     for (p = first_shift; p; ++k, p = p->next)
                    417:     {
                    418:        if (k) printf("\n");
                    419:        printf("shift %d, number = %d, nshifts = %d\n", k, p->number,
                    420:                p->nshifts);
                    421:        j = p->nshifts;
                    422:        for (i = 0; i < j; ++i)
                    423:            printf("\t%d\n", p->shift[i]);
                    424:     }
                    425: }
                    426: 
                    427: 
                    428: save_shifts()
                    429: {
                    430:   register shifts *p;
                    431:   register short *sp1;
                    432:   register short *sp2;
                    433:   register short *send;
                    434: 
                    435:   p = (shifts *) allocate((unsigned) (sizeof(shifts) +
                    436:                        (nshifts - 1) * sizeof(short)));
                    437: 
                    438:   p->number = this_state->number;
                    439:   p->nshifts = nshifts;
                    440: 
                    441:   sp1 = shiftset;
                    442:   sp2 = p->shift;
                    443:   send = shiftset + nshifts;
                    444: 
                    445:   while (sp1 < send)
                    446:     *sp2++ = *sp1++;
                    447: 
                    448:   if (last_shift)
                    449:     {
                    450:       last_shift->next = p;
                    451:       last_shift = p;
                    452:     }
                    453:   else
                    454:     {
                    455:       first_shift = p;
                    456:       last_shift = p;
                    457:     }
                    458: }
                    459: 
                    460: 
                    461: 
                    462: save_reductions()
                    463: {
                    464:   register short *isp;
                    465:   register short *rp1;
                    466:   register short *rp2;
                    467:   register int item;
                    468:   register int count;
                    469:   register reductions *p;
                    470: 
                    471:   short *rend;
                    472: 
                    473:   count = 0;
                    474:   for (isp = itemset; isp < itemsetend; isp++)
                    475:     {
                    476:       item = ritem[*isp];
                    477:       if (item < 0)
                    478:        {
                    479:          redset[count++] = -item;
                    480:        }
                    481:     }
                    482: 
                    483:   if (count)
                    484:     {
                    485:       p = (reductions *) allocate((unsigned) (sizeof(reductions) +
                    486:                                        (count - 1) * sizeof(short)));
                    487: 
                    488:       p->number = this_state->number;
                    489:       p->nreds = count;
                    490: 
                    491:       rp1 = redset;
                    492:       rp2 = p->rules;
                    493:       rend = rp1 + count;
                    494: 
                    495:       while (rp1 < rend)
                    496:        *rp2++ = *rp1++;
                    497: 
                    498:       if (last_reduction)
                    499:        {
                    500:          last_reduction->next = p;
                    501:          last_reduction = p;
                    502:        }
                    503:       else
                    504:        {
                    505:          first_reduction = p;
                    506:          last_reduction = p;
                    507:        }
                    508:     }
                    509: }
                    510: 
                    511: 
                    512: set_derives()
                    513: {
                    514:   register int i, k;
                    515:   register int lhs;
                    516:   register short *rules;
                    517: 
                    518:   derives = NEW2(nsyms, short *);
                    519:   rules = NEW2(nvars + nrules, short);
                    520: 
                    521:   k = 0;
                    522:   for (lhs = start_symbol; lhs < nsyms; lhs++)
                    523:     {
                    524:       derives[lhs] = rules + k;
                    525:       for (i = 0; i < nrules; i++)
                    526:        {
                    527:          if (rlhs[i] == lhs)
                    528:            {
                    529:              rules[k] = i;
                    530:              k++;
                    531:            }
                    532:        }
                    533:       rules[k] = -1;
                    534:       k++;
                    535:     }
                    536: 
                    537: #ifdef DEBUG
                    538:   print_derives();
                    539: #endif
                    540: }
                    541: 
                    542: free_derives()
                    543: {
                    544:   FREE(derives[start_symbol]);
                    545:   FREE(derives);
                    546: }
                    547: 
                    548: #ifdef DEBUG
                    549: print_derives()
                    550: {
                    551:   register int i;
                    552:   register short *sp;
                    553: 
                    554:   printf("\nDERIVES\n\n");
                    555: 
                    556:   for (i = start_symbol; i < nsyms; i++)
                    557:     {
                    558:       printf("%s derives ", symbol_name[i]);
                    559:       for (sp = derives[i]; *sp >= 0; sp++)
                    560:        {
                    561:          printf("  %d", *sp);
                    562:        }
                    563:       putchar('\n');
                    564:     }
                    565: 
                    566:   putchar('\n');
                    567: }
                    568: #endif
                    569: 
                    570: 
                    571: set_nullable()
                    572: {
                    573:     register int i, j;
                    574:     register int empty;
                    575:     int done;
                    576: 
                    577:     nullable = MALLOC(nsyms);
                    578:     if (nullable == 0) no_space();
                    579: 
                    580:     for (i = 0; i < nsyms; ++i)
                    581:        nullable[i] = 0;
                    582: 
                    583:     done = 0;
                    584:     while (!done)
                    585:     {
                    586:        done = 1;
                    587:        for (i = 1; i < nitems; i++)
                    588:        {
                    589:            empty = 1;
                    590:            while ((j = ritem[i]) >= 0)
                    591:            {
                    592:                if (!nullable[j])
                    593:                    empty = 0;
                    594:                ++i;
                    595:            }
                    596:            if (empty)
                    597:            {
                    598:                j = rlhs[-j];
                    599:                if (!nullable[j])
                    600:                {
                    601:                    nullable[j] = 1;
                    602:                    done = 0;
                    603:                }
                    604:            }
                    605:        }
                    606:     }
                    607: 
                    608: #ifdef DEBUG
                    609:     for (i = 0; i < nsyms; i++)
                    610:     {
                    611:        if (nullable[i])
                    612:            printf("%s is nullable\n", symbol_name[i]);
                    613:        else
                    614:            printf("%s is not nullable\n", symbol_name[i]);
                    615:     }
                    616: #endif
                    617: }
                    618: 
                    619: 
                    620: free_nullable()
                    621: {
                    622:   FREE(nullable);
                    623: }
                    624: 
                    625: 
                    626: lr0()
                    627: {
                    628:     set_derives();
                    629:     set_nullable();
                    630:     generate_states();
                    631: }

unix.superglobalmegacorp.com

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