Annotation of GNUtools/bison/print.c, revision 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.