Annotation of 43BSDReno/pgrm/yacc/verbose.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[] = "@(#)verbose.c  5.2 (Berkeley) 6/1/90";
                     25: #endif /* not lint */
                     26: 
                     27: #include "defs.h"
                     28: 
                     29: 
                     30: static short *null_rules;
                     31: 
                     32: verbose()
                     33: {
                     34:     register int i;
                     35: 
                     36:     if (!vflag) return;
                     37: 
                     38:     null_rules = (short *) MALLOC(nrules*sizeof(short));
                     39:     if (null_rules == 0) no_space();
                     40:     fprintf(verbose_file, "\f\n");
                     41:     for (i = 0; i < nstates; i++)
                     42:        print_state(i);
                     43:     FREE(null_rules);
                     44: 
                     45:     if (nunused)
                     46:        log_unused();
                     47:     if (SRtotal || RRtotal)
                     48:        log_conflicts();
                     49: 
                     50:     fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,
                     51:            nvars);
                     52:     fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates);
                     53: }
                     54: 
                     55: 
                     56: log_unused()
                     57: {
                     58:     register int i;
                     59:     register short *p;
                     60: 
                     61:     fprintf(verbose_file, "\n\nRules never reduced:\n");
                     62:     for (i = 3; i < nrules; ++i)
                     63:     {
                     64:        if (!rules_used[i])
                     65:        {
                     66:            fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
                     67:            for (p = ritem + rrhs[i]; *p >= 0; ++p)
                     68:                fprintf(verbose_file, " %s", symbol_name[*p]);
                     69:            fprintf(verbose_file, "  (%d)\n", i - 2);
                     70:        }
                     71:     }
                     72: }
                     73: 
                     74: 
                     75: log_conflicts()
                     76: {
                     77:     register int i;
                     78: 
                     79:     fprintf(verbose_file, "\n\n");
                     80:     for (i = 0; i < nstates; i++)
                     81:     {
                     82:        if (SRconflicts[i] || RRconflicts[i])
                     83:        {
                     84:            fprintf(verbose_file, "State %d contains ", i);
                     85:            if (SRconflicts[i] == 1)
                     86:                fprintf(verbose_file, "1 shift/reduce conflict");
                     87:            else if (SRconflicts[i] > 1)
                     88:                fprintf(verbose_file, "%d shift/reduce conflicts",
                     89:                        SRconflicts[i]);
                     90:            if (SRconflicts[i] && RRconflicts[i])
                     91:                fprintf(verbose_file, ", ");
                     92:            if (RRconflicts[i] == 1)
                     93:                fprintf(verbose_file, "1 reduce/reduce conflict");
                     94:            else if (RRconflicts[i] > 1)
                     95:                fprintf(verbose_file, "%d reduce/reduce conflicts",
                     96:                        RRconflicts[i]);
                     97:            fprintf(verbose_file, ".\n");
                     98:        }
                     99:     }
                    100: }
                    101: 
                    102: 
                    103: print_state(state)
                    104: int state;
                    105: {
                    106:     if (state)
                    107:        fprintf(verbose_file, "\n\n");
                    108:     if (SRconflicts[state] || RRconflicts[state])
                    109:        print_conflicts(state);
                    110:     fprintf(verbose_file, "state %d\n", state);
                    111:     print_core(state);
                    112:     print_nulls(state);
                    113:     print_actions(state);
                    114: }
                    115: 
                    116: 
                    117: print_conflicts(state)
                    118: int state;
                    119: {
                    120:     register int symbol;
                    121:     register action *p, *q, *r;
                    122: 
                    123:     for (p = parser[state]; p; p = q->next)
                    124:     {
                    125:        q = p;
                    126:        if (p->action_code == ERROR || p->suppressed == 2)
                    127:            continue;
                    128: 
                    129:        symbol = p->symbol;
                    130:        while (q->next && q->next->symbol == symbol)
                    131:            q = q->next;
                    132:        if (state == final_state && symbol == 0)
                    133:        {
                    134:            r = p;
                    135:            for (;;)
                    136:            {
                    137:                fprintf(verbose_file, "%d: shift/reduce conflict \
                    138: (accept, reduce %d) on $end\n", state, r->number - 2);
                    139:                if (r == q) break;
                    140:                r = r->next;
                    141:            }
                    142:        }
                    143:        else if (p != q)
                    144:        {
                    145:            r = p->next;
                    146:            if (p->action_code == SHIFT)
                    147:            {
                    148:                for (;;)
                    149:                {
                    150:                    if (r->action_code == REDUCE && p->suppressed != 2)
                    151:                        fprintf(verbose_file, "%d: shift/reduce conflict \
                    152: (shift %d, reduce %d) on %s\n", state, p->number, r->number - 2,
                    153:                                symbol_name[symbol]);
                    154:                    if (r == q) break;
                    155:                    r = r->next;
                    156:                }
                    157:            }
                    158:            else
                    159:            {
                    160:                for (;;)
                    161:                {
                    162:                    if (r->action_code == REDUCE && p->suppressed != 2)
                    163:                        fprintf(verbose_file, "%d: reduce/reduce conflict \
                    164: (reduce %d, reduce %d) on %s\n", state, p->number - 2, r->number - 2,
                    165:                                symbol_name[symbol]);
                    166:                    if (r == q) break;
                    167:                    r = r->next;
                    168:                }
                    169:            }
                    170:        }
                    171:     }
                    172: }
                    173: 
                    174: 
                    175: print_core(state)
                    176: int state;
                    177: {
                    178:     register int i;
                    179:     register int k;
                    180:     register int rule;
                    181:     register core *statep;
                    182:     register short *sp;
                    183:     register short *sp1;
                    184: 
                    185:     statep = state_table[state];
                    186:     k = statep->nitems;
                    187: 
                    188:     for (i = 0; i < k; i++)
                    189:     {
                    190:        sp1 = sp = ritem + statep->items[i];
                    191: 
                    192:        while (*sp >= 0) ++sp;
                    193:        rule = -(*sp);
                    194:        fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
                    195: 
                    196:         for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
                    197:            fprintf(verbose_file, "%s ", symbol_name[*sp]);
                    198: 
                    199:        putc('.', verbose_file);
                    200: 
                    201:        while (*sp >= 0)
                    202:        {
                    203:            fprintf(verbose_file, " %s", symbol_name[*sp]);
                    204:            sp++;
                    205:        }
                    206:        fprintf(verbose_file, "  (%d)\n", -2 - *sp);
                    207:     }
                    208: }
                    209: 
                    210: 
                    211: print_nulls(state)
                    212: int state;
                    213: {
                    214:     register action *p;
                    215:     register int i, j, k, nnulls;
                    216: 
                    217:     nnulls = 0;
                    218:     for (p = parser[state]; p; p = p->next)
                    219:     {
                    220:        if (p->action_code == REDUCE &&
                    221:                (p->suppressed == 0 || p->suppressed == 1))
                    222:        {
                    223:            i = p->number;
                    224:            if (rrhs[i] + 1 == rrhs[i+1])
                    225:            {
                    226:                for (j = 0; j < nnulls && i > null_rules[j]; ++j)
                    227:                    continue;
                    228: 
                    229:                if (j == nnulls)
                    230:                {
                    231:                    ++nnulls;
                    232:                    null_rules[j] = i;
                    233:                }
                    234:                else if (i != null_rules[j])
                    235:                {
                    236:                    ++nnulls;
                    237:                    for (k = nnulls - 1; k > j; --k)
                    238:                        null_rules[k] = null_rules[k-1];
                    239:                    null_rules[j] = i;
                    240:                }
                    241:            }
                    242:        }
                    243:     }
                    244: 
                    245:     for (i = 0; i < nnulls; ++i)
                    246:     {
                    247:        j = null_rules[i];
                    248:        fprintf(verbose_file, "\t%s : .  (%d)\n", symbol_name[rlhs[j]],
                    249:                j - 2);
                    250:     }
                    251:     fprintf(verbose_file, "\n");
                    252: }
                    253: 
                    254: 
                    255: print_actions(stateno)
                    256: int stateno;
                    257: {
                    258:     register action *p;
                    259:     register shifts *sp;
                    260:     register int as;
                    261: 
                    262:     if (stateno == final_state)
                    263:        fprintf(verbose_file, "\t$end  accept\n");
                    264: 
                    265:     p = parser[stateno];
                    266:     if (p)
                    267:     {
                    268:        print_shifts(p);
                    269:        print_reductions(p, defred[stateno]);
                    270:     }
                    271: 
                    272:     sp = shift_table[stateno];
                    273:     if (sp && sp->nshifts > 0)
                    274:     {
                    275:        as = accessing_symbol[sp->shift[sp->nshifts - 1]];
                    276:        if (ISVAR(as))
                    277:            print_gotos(stateno);
                    278:     }
                    279: }
                    280: 
                    281: 
                    282: print_shifts(p)
                    283: register action *p;
                    284: {
                    285:     register int count;
                    286:     register action *q;
                    287: 
                    288:     count = 0;
                    289:     for (q = p; q; q = q->next)
                    290:     {
                    291:        if (q->suppressed < 2 && q->action_code == SHIFT)
                    292:            ++count;
                    293:     }
                    294: 
                    295:     if (count > 0)
                    296:     {
                    297:        for (; p; p = p->next)
                    298:        {
                    299:            if (p->action_code == SHIFT && p->suppressed == 0)
                    300:                fprintf(verbose_file, "\t%s  shift %d\n",
                    301:                            symbol_name[p->symbol], p->number);
                    302:        }
                    303:     }
                    304: }
                    305: 
                    306: 
                    307: print_reductions(p, defred)
                    308: register action *p;
                    309: register int defred;
                    310: {
                    311:     register int k, anyreds;
                    312:     register action *q;
                    313: 
                    314:     anyreds = 0;
                    315:     for (q = p; q ; q = q->next)
                    316:     {
                    317:        if (q->action_code == REDUCE && q->suppressed < 2)
                    318:        {
                    319:            anyreds = 1;
                    320:            break;
                    321:        }
                    322:     }
                    323: 
                    324:     if (anyreds == 0)
                    325:        fprintf(verbose_file, "\t.  error\n");
                    326:     else
                    327:     {
                    328:        for (; p; p = p->next)
                    329:        {
                    330:            if (p->action_code == REDUCE && p->number != defred)
                    331:            {
                    332:                k = p->number - 2;
                    333:                if (p->suppressed == 0)
                    334:                    fprintf(verbose_file, "\t%s  reduce %d\n",
                    335:                            symbol_name[p->symbol], k);
                    336:            }
                    337:        }
                    338: 
                    339:         if (defred > 0)
                    340:            fprintf(verbose_file, "\t.  reduce %d\n", defred - 2);
                    341:     }
                    342: }
                    343: 
                    344: 
                    345: print_gotos(stateno)
                    346: int stateno;
                    347: {
                    348:     register int i, k;
                    349:     register int as;
                    350:     register short *to_state;
                    351:     register shifts *sp;
                    352: 
                    353:     putc('\n', verbose_file);
                    354:     sp = shift_table[stateno];
                    355:     to_state = sp->shift;
                    356:     for (i = 0; i < sp->nshifts; ++i)
                    357:     {
                    358:        k = to_state[i];
                    359:        as = accessing_symbol[k];
                    360:        if (ISVAR(as))
                    361:            fprintf(verbose_file, "\t%s  goto %d\n", symbol_name[as], k);
                    362:     }
                    363: }

unix.superglobalmegacorp.com

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