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

1.1       root        1: /* Print information on generated parser, for bison,
                      2:    Copyright (C) 1984, 1986, 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: #include <stdio.h>
                     22: #include "system.h"
                     23: #include "machine.h"
                     24: #include "new.h"
                     25: #include "files.h"
                     26: #include "gram.h"
                     27: #include "state.h"
                     28: 
                     29: 
                     30: extern char **tags;
                     31: extern int nstates;
                     32: extern short *accessing_symbol;
                     33: extern core **state_table;
                     34: extern shifts **shift_table;
                     35: extern errs **err_table;
                     36: extern reductions **reduction_table;
                     37: extern char *consistent;
                     38: extern char any_conflicts;
                     39: extern char *conflicts;
                     40: extern int final_state;
                     41: 
                     42: extern void conflict_log();
                     43: extern void verbose_conflict_log();
                     44: extern void print_reductions();
                     45: 
                     46: void print_token();
                     47: void print_state();
                     48: void print_core();
                     49: void print_actions();
                     50: void print_grammar();
                     51: 
                     52: void
                     53: terse()
                     54: {
                     55:   if (any_conflicts)
                     56:     {
                     57:       conflict_log();
                     58:     }
                     59: }
                     60: 
                     61: 
                     62: void
                     63: verbose()
                     64: {
                     65:   register int i;
                     66: 
                     67:   if (any_conflicts)
                     68:     verbose_conflict_log();
                     69: 
                     70:   print_grammar();
                     71: 
                     72:   for (i = 0; i < nstates; i++)
                     73:     {
                     74:       print_state(i);
                     75:     }
                     76: }
                     77: 
                     78: 
                     79: void
                     80: print_token(extnum, token)
                     81: int extnum, token;
                     82: {
                     83:   fprintf(foutput, " type %d is %s\n", extnum, tags[token]);
                     84: }
                     85: 
                     86: 
                     87: void
                     88: print_state(state)
                     89: int state;
                     90: {
                     91:   fprintf(foutput, "\n\nstate %d\n\n", state);
                     92:   print_core(state);
                     93:   print_actions(state);
                     94: }
                     95: 
                     96: 
                     97: void
                     98: print_core(state)
                     99: int state;
                    100: {
                    101:   register int i;
                    102:   register int k;
                    103:   register int rule;
                    104:   register core *statep;
                    105:   register short *sp;
                    106:   register short *sp1;
                    107: 
                    108:   statep = state_table[state];
                    109:   k = statep->nitems;
                    110: 
                    111:   if (k == 0) return;
                    112: 
                    113:   for (i = 0; i < k; i++)
                    114:     {
                    115:       sp1 = sp = ritem + statep->items[i];
                    116: 
                    117:       while (*sp > 0)
                    118:        sp++;
                    119: 
                    120:       rule = -(*sp);
                    121:       fprintf(foutput, "    %s  ->  ", tags[rlhs[rule]]);
                    122: 
                    123:       for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
                    124:        {
                    125:          fprintf(foutput, "%s ", tags[*sp]);
                    126:        }
                    127: 
                    128:       putc('.', foutput);
                    129: 
                    130:       while (*sp > 0)
                    131:        {
                    132:          fprintf(foutput, " %s", tags[*sp]);
                    133:          sp++;
                    134:        }
                    135: 
                    136:       fprintf (foutput, "   (rule %d)", rule);
                    137:       putc('\n', foutput);
                    138:     }
                    139: 
                    140:   putc('\n', foutput);
                    141: }
                    142: 
                    143: 
                    144: void
                    145: print_actions(state)
                    146: int state;
                    147: {
                    148:   register int i;
                    149:   register int k;
                    150:   register int state1;
                    151:   register int symbol;
                    152:   register shifts *shiftp;
                    153:   register errs *errp;
                    154:   register reductions *redp;
                    155:   register int rule;
                    156: 
                    157:   shiftp = shift_table[state];
                    158:   redp = reduction_table[state];
                    159:   errp = err_table[state];
                    160: 
                    161:   if (!shiftp && !redp)
                    162:     {
                    163:       if (final_state == state)
                    164:        fprintf(foutput, "    $default\taccept\n");
                    165:       else
                    166:        fprintf(foutput, "    NO ACTIONS\n");
                    167:       return;
                    168:     }
                    169: 
                    170:   if (shiftp)
                    171:     {
                    172:       k = shiftp->nshifts;
                    173: 
                    174:       for (i = 0; i < k; i++)
                    175:        {
                    176:          if (! shiftp->shifts[i]) continue;
                    177:          state1 = shiftp->shifts[i];
                    178:          symbol = accessing_symbol[state1];
                    179:          /* The following line used to be turned off.  */
                    180:          if (ISVAR(symbol)) break;
                    181:           if (symbol==0)      /* I.e. strcmp(tags[symbol],"$")==0 */
                    182:             fprintf(foutput, "    $   \tgo to state %d\n", state1);
                    183:           else
                    184:             fprintf(foutput, "    %-4s\tshift, and go to state %d\n",
                    185:                     tags[symbol], state1);
                    186:        }
                    187: 
                    188:       if (i > 0)
                    189:        putc('\n', foutput);
                    190:     }
                    191:   else
                    192:     {
                    193:       i = 0;
                    194:       k = 0;
                    195:     }
                    196: 
                    197:   if (errp)
                    198:     {
                    199:       int j, nerrs;
                    200: 
                    201:       nerrs = errp->nerrs;
                    202: 
                    203:       for (j = 0; j < nerrs; j++)
                    204:        {
                    205:          if (! errp->errs[j]) continue;
                    206:          symbol = errp->errs[j];
                    207:          fprintf(foutput, "    %-4s\terror (nonassociative)\n", tags[symbol]);
                    208:        }
                    209: 
                    210:       if (j > 0)
                    211:        putc('\n', foutput);
                    212:     }
                    213: 
                    214:   if (consistent[state] && redp)
                    215:     {
                    216:       rule = redp->rules[0];
                    217:       symbol = rlhs[rule];
                    218:       fprintf(foutput, "    $default\treduce using rule %d (%s)\n\n",
                    219:                rule, tags[symbol]);
                    220:     }
                    221:   else if (redp)
                    222:     {
                    223:       print_reductions(state);
                    224:     }
                    225: 
                    226:   if (i < k)
                    227:     {
                    228:       for (; i < k; i++)
                    229:        {
                    230:          if (! shiftp->shifts[i]) continue;
                    231:          state1 = shiftp->shifts[i];
                    232:          symbol = accessing_symbol[state1];
                    233:          fprintf(foutput, "    %-4s\tgo to state %d\n", tags[symbol], state1);
                    234:        }
                    235: 
                    236:       putc('\n', foutput);
                    237:     }
                    238: }
                    239: 
                    240: #define END_TEST(end) \
                    241:   if (column + strlen(buffer) > (end))                                  \
                    242:     { fprintf (foutput, "%s\n   ", buffer); column = 3; buffer[0] = 0; } \
                    243:   else
                    244: 
                    245: void
                    246: print_grammar()
                    247: {
                    248:   int i, j;
                    249:   short* rule;
                    250:   char buffer[90];
                    251:   int column = 0;
                    252: 
                    253:   /* rule # : LHS -> RHS */
                    254:   fputs("\nGrammar\n", foutput);
                    255:   for (i = 1; i <= nrules; i++)
                    256:     /* Don't print rules disabled in reduce_grammar_tables.  */
                    257:     if (rlhs[i] >= 0)
                    258:       {
                    259:        fprintf(foutput, "rule %-4d %s ->", i, tags[rlhs[i]]);
                    260:        rule = &ritem[rrhs[i]];
                    261:        if (*rule > 0)
                    262:          while (*rule > 0)
                    263:            fprintf(foutput, " %s", tags[*rule++]);
                    264:        else
                    265:          fputs ("              /* empty */", foutput);
                    266:        putc('\n', foutput);
                    267:       }
                    268: 
                    269:   /* TERMINAL (type #) : rule #s terminal is on RHS */
                    270:   fputs("\nTerminals, with rules where they appear\n\n", foutput);
                    271:   fprintf(foutput, "%s (-1)\n", tags[0]);
                    272:   if (translations)
                    273:     {
                    274:       for (i = 0; i <= max_user_token_number; i++)
                    275:        if (token_translations[i] != 2)
                    276:          {
                    277:            buffer[0] = 0;
                    278:            column = strlen (tags[token_translations[i]]);
                    279:            fprintf(foutput, "%s", tags[token_translations[i]]);
                    280:            END_TEST (50);
                    281:            sprintf (buffer, " (%d)", i);
                    282: 
                    283:            for (j = 1; j <= nrules; j++)
                    284:              {
                    285:                for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
                    286:                  if (*rule == token_translations[i])
                    287:                    {
                    288:                      END_TEST (65);
                    289:                      sprintf (buffer + strlen(buffer), " %d", j);
                    290:                      break;
                    291:                    }
                    292:              }
                    293:            fprintf (foutput, "%s\n", buffer);
                    294:          }
                    295:     }
                    296:   else
                    297:     for (i = 1; i < ntokens; i++)
                    298:       {
                    299:        buffer[0] = 0;
                    300:        column = strlen (tags[i]);
                    301:        fprintf(foutput, "%s", tags[i]);
                    302:        END_TEST (50);
                    303:        sprintf (buffer, " (%d)", i);
                    304: 
                    305:        for (j = 1; j <= nrules; j++)
                    306:          {
                    307:            for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
                    308:              if (*rule == i)
                    309:                {
                    310:                  END_TEST (65);
                    311:                  sprintf (buffer + strlen(buffer), " %d", j);
                    312:                  break;
                    313:                }
                    314:          }
                    315:        fprintf (foutput, "%s\n", buffer);
                    316:       }
                    317: 
                    318:   fputs("\nNonterminals, with rules where they appear\n\n", foutput);
                    319:   for (i = ntokens; i <= nsyms - 1; i++)
                    320:     {
                    321:       int left_count = 0, right_count = 0;
                    322: 
                    323:       for (j = 1; j <= nrules; j++)
                    324:        {
                    325:          if (rlhs[j] == i)
                    326:            left_count++;
                    327:          for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
                    328:            if (*rule == i)
                    329:              {
                    330:                right_count++;
                    331:                break;
                    332:              }
                    333:        }
                    334: 
                    335:       buffer[0] = 0;
                    336:       fprintf(foutput, "%s", tags[i]);
                    337:       column = strlen (tags[i]);
                    338:       sprintf (buffer, " (%d)", i);
                    339:       END_TEST (0);
                    340: 
                    341:       if (left_count > 0)
                    342:        {
                    343:          END_TEST (50);
                    344:          sprintf (buffer + strlen(buffer), " on left:");
                    345: 
                    346:          for (j = 1; j <= nrules; j++)
                    347:            {
                    348:              END_TEST (65);
                    349:              if (rlhs[j] == i)
                    350:                sprintf (buffer + strlen(buffer), " %d", j);
                    351:            }
                    352:        }
                    353: 
                    354:       if (right_count > 0)
                    355:        {
                    356:          if (left_count > 0)
                    357:            sprintf (buffer + strlen(buffer), ",");
                    358:          END_TEST (50);
                    359:          sprintf (buffer + strlen(buffer), " on right:");
                    360:          for (j = 1; j <= nrules; j++)
                    361:            {
                    362:              for (rule = &ritem[rrhs[j]]; *rule > 0; rule++)
                    363:                if (*rule == i)
                    364:                  {
                    365:                    END_TEST (65);
                    366:                    sprintf (buffer + strlen(buffer), " %d", j);
                    367:                    break;
                    368:                  }
                    369:            }
                    370:        }
                    371:       fprintf (foutput, "%s\n", buffer);
                    372:     }
                    373: }

unix.superglobalmegacorp.com

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