Annotation of 43BSDReno/pgrm/yacc/output.c, revision 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[] = "@(#)output.c   5.5 (Berkeley) 6/1/90";
        !            25: #endif /* not lint */
        !            26: 
        !            27: #include "defs.h"
        !            28: 
        !            29: static int nvectors;
        !            30: static int nentries;
        !            31: static short **froms;
        !            32: static short **tos;
        !            33: static short *tally;
        !            34: static short *width;
        !            35: static short *state_count;
        !            36: static short *order;
        !            37: static short *base;
        !            38: static short *pos;
        !            39: static int maxtable;
        !            40: static short *table;
        !            41: static short *check;
        !            42: static int lowzero;
        !            43: static int high;
        !            44: 
        !            45: 
        !            46: output()
        !            47: {
        !            48:     free_itemsets();
        !            49:     free_shifts();
        !            50:     free_reductions();
        !            51:     output_stored_text();
        !            52:     output_defines();
        !            53:     output_rule_data();
        !            54:     output_yydefred();
        !            55:     output_actions();
        !            56:     free_parser();
        !            57:     output_debug();
        !            58:     output_stype();
        !            59:     write_section(header);
        !            60:     output_trailing_text();
        !            61:     write_section(body);
        !            62:     output_semantic_actions();
        !            63:     write_section(trailer);
        !            64: }
        !            65: 
        !            66: 
        !            67: output_rule_data()
        !            68: {
        !            69:     register int i;
        !            70:     register int j;
        !            71: 
        !            72:   
        !            73:     fprintf(output_file, "short yylhs[] = {%42d,",
        !            74:            symbol_value[start_symbol]);
        !            75: 
        !            76:     j = 10;
        !            77:     for (i = 3; i < nrules; i++)
        !            78:     {
        !            79:        if (j >= 10)
        !            80:        {
        !            81:            ++outline;
        !            82:            putc('\n', output_file);
        !            83:            j = 1;
        !            84:        }
        !            85:         else
        !            86:            ++j;
        !            87: 
        !            88:         fprintf(output_file, "%5d,", symbol_value[rlhs[i]]);
        !            89:     }
        !            90:     outline += 2;
        !            91:     fprintf(output_file, "\n};\n");
        !            92: 
        !            93:     fprintf(output_file, "short yylen[] = {%42d,", 2);
        !            94: 
        !            95:     j = 10;
        !            96:     for (i = 3; i < nrules; i++)
        !            97:     {
        !            98:        if (j >= 10)
        !            99:        {
        !           100:            ++outline;
        !           101:            putc('\n', output_file);
        !           102:            j = 1;
        !           103:        }
        !           104:        else
        !           105:          j++;
        !           106: 
        !           107:         fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1);
        !           108:     }
        !           109:     outline += 2;
        !           110:     fprintf(output_file, "\n};\n");
        !           111: }
        !           112: 
        !           113: 
        !           114: output_yydefred()
        !           115: {
        !           116:     register int i, j;
        !           117: 
        !           118:     fprintf(output_file, "short yydefred[] = {%39d,",
        !           119:            (defred[0] ? defred[0] - 2 : 0));
        !           120: 
        !           121:     j = 10;
        !           122:     for (i = 1; i < nstates; i++)
        !           123:     {
        !           124:        if (j < 10)
        !           125:            ++j;
        !           126:        else
        !           127:        {
        !           128:            ++outline;
        !           129:            putc('\n', output_file);
        !           130:            j = 1;
        !           131:        }
        !           132: 
        !           133:        fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0));
        !           134:     }
        !           135: 
        !           136:     outline += 2;
        !           137:     fprintf(output_file, "\n};\n");
        !           138: }
        !           139: 
        !           140: 
        !           141: output_actions()
        !           142: {
        !           143:     nvectors = 2*nstates + nvars;
        !           144: 
        !           145:     froms = NEW2(nvectors, short *);
        !           146:     tos = NEW2(nvectors, short *);
        !           147:     tally = NEW2(nvectors, short);
        !           148:     width = NEW2(nvectors, short);
        !           149: 
        !           150:     token_actions();
        !           151:     FREE(lookaheads);
        !           152:     FREE(LA);
        !           153:     FREE(LAruleno);
        !           154:     FREE(accessing_symbol);
        !           155: 
        !           156:     goto_actions();
        !           157:     FREE(goto_map + ntokens);
        !           158:     FREE(from_state);
        !           159:     FREE(to_state);
        !           160: 
        !           161:     sort_actions();
        !           162:     pack_table();
        !           163:     output_base();
        !           164:     output_table();
        !           165:     output_check();
        !           166: }
        !           167: 
        !           168: 
        !           169: token_actions()
        !           170: {
        !           171:     register int i, j;
        !           172:     register int shiftcount, reducecount;
        !           173:     register int max, min;
        !           174:     register short *actionrow, *r, *s;
        !           175:     register action *p;
        !           176: 
        !           177:     actionrow = NEW2(2*ntokens, short);
        !           178:     for (i = 0; i < nstates; ++i)
        !           179:     {
        !           180:        if (parser[i])
        !           181:        {
        !           182:            for (j = 0; j < 2*ntokens; ++j)
        !           183:            actionrow[j] = 0;
        !           184: 
        !           185:            shiftcount = 0;
        !           186:            reducecount = 0;
        !           187:            for (p = parser[i]; p; p = p->next)
        !           188:            {
        !           189:                if (p->suppressed == 0)
        !           190:                {
        !           191:                    if (p->action_code == SHIFT)
        !           192:                    {
        !           193:                        ++shiftcount;
        !           194:                        actionrow[p->symbol] = p->number;
        !           195:                    }
        !           196:                    else if (p->action_code == REDUCE && p->number != defred[i])
        !           197:                    {
        !           198:                        ++reducecount;
        !           199:                        actionrow[p->symbol + ntokens] = p->number;
        !           200:                    }
        !           201:                }
        !           202:            }
        !           203: 
        !           204:            tally[i] = shiftcount;
        !           205:            tally[nstates+i] = reducecount;
        !           206:            width[i] = 0;
        !           207:            width[nstates+i] = 0;
        !           208:            if (shiftcount > 0)
        !           209:            {
        !           210:                froms[i] = r = NEW2(shiftcount, short);
        !           211:                tos[i] = s = NEW2(shiftcount, short);
        !           212:                min = MAXSHORT;
        !           213:                max = 0;
        !           214:                for (j = 0; j < ntokens; ++j)
        !           215:                {
        !           216:                    if (actionrow[j])
        !           217:                    {
        !           218:                        if (min > symbol_value[j])
        !           219:                            min = symbol_value[j];
        !           220:                        if (max < symbol_value[j])
        !           221:                            max = symbol_value[j];
        !           222:                        *r++ = symbol_value[j];
        !           223:                        *s++ = actionrow[j];
        !           224:                    }
        !           225:                }
        !           226:                width[i] = max - min + 1;
        !           227:            }
        !           228:            if (reducecount > 0)
        !           229:            {
        !           230:                froms[nstates+i] = r = NEW2(reducecount, short);
        !           231:                tos[nstates+i] = s = NEW2(reducecount, short);
        !           232:                min = MAXSHORT;
        !           233:                max = 0;
        !           234:                for (j = 0; j < ntokens; ++j)
        !           235:                {
        !           236:                    if (actionrow[ntokens+j])
        !           237:                    {
        !           238:                        if (min > symbol_value[j])
        !           239:                            min = symbol_value[j];
        !           240:                        if (max < symbol_value[j])
        !           241:                            max = symbol_value[j];
        !           242:                        *r++ = symbol_value[j];
        !           243:                        *s++ = actionrow[ntokens+j] - 2;
        !           244:                    }
        !           245:                }
        !           246:                width[nstates+i] = max - min + 1;
        !           247:            }
        !           248:        }
        !           249:     }
        !           250:     FREE(actionrow);
        !           251: }
        !           252: 
        !           253: goto_actions()
        !           254: {
        !           255:     register int i, j, k;
        !           256: 
        !           257:     state_count = NEW2(nstates, short);
        !           258: 
        !           259:     k = default_goto(start_symbol + 1);
        !           260:     fprintf(output_file, "short yydgoto[] = {%40d,", k);
        !           261:     save_column(start_symbol + 1, k);
        !           262: 
        !           263:     j = 10;
        !           264:     for (i = start_symbol + 2; i < nsyms; i++)
        !           265:     {
        !           266:        if (j >= 10)
        !           267:        {
        !           268:            ++outline;
        !           269:            putc('\n', output_file);
        !           270:            j = 1;
        !           271:        }
        !           272:        else
        !           273:            ++j;
        !           274: 
        !           275:        k = default_goto(i);
        !           276:        fprintf(output_file, "%5d,", k);
        !           277:        save_column(i, k);
        !           278:     }
        !           279: 
        !           280:     outline += 2;
        !           281:     fprintf(output_file, "\n};\n");
        !           282:     FREE(state_count);
        !           283: }
        !           284: 
        !           285: int
        !           286: default_goto(symbol)
        !           287: int symbol;
        !           288: {
        !           289:     register int i;
        !           290:     register int m;
        !           291:     register int n;
        !           292:     register int default_state;
        !           293:     register int max;
        !           294: 
        !           295:     m = goto_map[symbol];
        !           296:     n = goto_map[symbol + 1];
        !           297: 
        !           298:     if (m == n) return (0);
        !           299: 
        !           300:     for (i = 0; i < nstates; i++)
        !           301:        state_count[i] = 0;
        !           302: 
        !           303:     for (i = m; i < n; i++)
        !           304:        state_count[to_state[i]]++;
        !           305: 
        !           306:     max = 0;
        !           307:     default_state = 0;
        !           308:     for (i = 0; i < nstates; i++)
        !           309:     {
        !           310:        if (state_count[i] > max)
        !           311:        {
        !           312:            max = state_count[i];
        !           313:            default_state = i;
        !           314:        }
        !           315:     }
        !           316: 
        !           317:     return (default_state);
        !           318: }
        !           319: 
        !           320: 
        !           321: 
        !           322: save_column(symbol, default_state)
        !           323: int symbol;
        !           324: int default_state;
        !           325: {
        !           326:     register int i;
        !           327:     register int m;
        !           328:     register int n;
        !           329:     register short *sp;
        !           330:     register short *sp1;
        !           331:     register short *sp2;
        !           332:     register int count;
        !           333:     register int symno;
        !           334: 
        !           335:     m = goto_map[symbol];
        !           336:     n = goto_map[symbol + 1];
        !           337: 
        !           338:     count = 0;
        !           339:     for (i = m; i < n; i++)
        !           340:     {
        !           341:        if (to_state[i] != default_state)
        !           342:            ++count;
        !           343:     }
        !           344:     if (count == 0) return;
        !           345: 
        !           346:     symno = symbol_value[symbol] + 2*nstates;
        !           347: 
        !           348:     froms[symno] = sp1 = sp = NEW2(count, short);
        !           349:     tos[symno] = sp2 = NEW2(count, short);
        !           350: 
        !           351:     for (i = m; i < n; i++)
        !           352:     {
        !           353:        if (to_state[i] != default_state)
        !           354:        {
        !           355:            *sp1++ = from_state[i];
        !           356:            *sp2++ = to_state[i];
        !           357:        }
        !           358:     }
        !           359: 
        !           360:     tally[symno] = count;
        !           361:     width[symno] = sp1[-1] - sp[0] + 1;
        !           362: }
        !           363: 
        !           364: sort_actions()
        !           365: {
        !           366:   register int i;
        !           367:   register int j;
        !           368:   register int k;
        !           369:   register int t;
        !           370:   register int w;
        !           371: 
        !           372:   order = NEW2(nvectors, short);
        !           373:   nentries = 0;
        !           374: 
        !           375:   for (i = 0; i < nvectors; i++)
        !           376:     {
        !           377:       if (tally[i] > 0)
        !           378:        {
        !           379:          t = tally[i];
        !           380:          w = width[i];
        !           381:          j = nentries - 1;
        !           382: 
        !           383:          while (j >= 0 && (width[order[j]] < w))
        !           384:            j--;
        !           385: 
        !           386:          while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
        !           387:            j--;
        !           388: 
        !           389:          for (k = nentries - 1; k > j; k--)
        !           390:            order[k + 1] = order[k];
        !           391: 
        !           392:          order[j + 1] = i;
        !           393:          nentries++;
        !           394:        }
        !           395:     }
        !           396: }
        !           397: 
        !           398: 
        !           399: pack_table()
        !           400: {
        !           401:     register int i;
        !           402:     register int place;
        !           403:     register int state;
        !           404: 
        !           405:     base = NEW2(nvectors, short);
        !           406:     pos = NEW2(nentries, short);
        !           407: 
        !           408:     maxtable = 1000;
        !           409:     table = NEW2(maxtable, short);
        !           410:     check = NEW2(maxtable, short);
        !           411: 
        !           412:     lowzero = 0;
        !           413:     high = 0;
        !           414: 
        !           415:     for (i = 0; i < maxtable; i++)
        !           416:        check[i] = -1;
        !           417: 
        !           418:     for (i = 0; i < nentries; i++)
        !           419:     {
        !           420:        state = matching_vector(i);
        !           421: 
        !           422:        if (state < 0)
        !           423:            place = pack_vector(i);
        !           424:        else
        !           425:            place = base[state];
        !           426: 
        !           427:        pos[i] = place;
        !           428:        base[order[i]] = place;
        !           429:     }
        !           430: 
        !           431:     for (i = 0; i < nvectors; i++)
        !           432:     {
        !           433:        if (froms[i])
        !           434:            FREE(froms[i]);
        !           435:        if (tos[i])
        !           436:            FREE(tos[i]);
        !           437:     }
        !           438: 
        !           439:     FREE(froms);
        !           440:     FREE(tos);
        !           441:     FREE(pos);
        !           442: }
        !           443: 
        !           444: 
        !           445: /*  The function matching_vector determines if the vector specified by */
        !           446: /*  the input parameter matches a previously considered        vector.  The    */
        !           447: /*  test at the start of the function checks if the vector represents  */
        !           448: /*  a row of shifts over terminal symbols or a row of reductions, or a */
        !           449: /*  column of shifts over a nonterminal symbol.  Berkeley Yacc does not        */
        !           450: /*  check if a column of shifts over a nonterminal symbols matches a   */
        !           451: /*  previously considered vector.  Because of the nature of LR parsing */
        !           452: /*  tables, no two columns can match.  Therefore, the only possible    */
        !           453: /*  match would be between a row and a column.  Such matches are       */
        !           454: /*  unlikely.  Therefore, to save time, no attempt is made to see if a */
        !           455: /*  column matches a previously considered vector.                     */
        !           456: /*                                                                     */
        !           457: /*  Matching_vector is poorly designed.  The test could easily be made */
        !           458: /*  faster.  Also, it depends on the vectors being in a specific       */
        !           459: /*  order.                                                             */
        !           460: 
        !           461: int
        !           462: matching_vector(vector)
        !           463: int vector;
        !           464: {
        !           465:     register int i;
        !           466:     register int j;
        !           467:     register int k;
        !           468:     register int t;
        !           469:     register int w;
        !           470:     register int match;
        !           471:     register int prev;
        !           472: 
        !           473:     i = order[vector];
        !           474:     if (i >= 2*nstates)
        !           475:        return (-1);
        !           476: 
        !           477:     t = tally[i];
        !           478:     w = width[i];
        !           479: 
        !           480:     for (prev = vector - 1; prev >= 0; prev--)
        !           481:     {
        !           482:        j = order[prev];
        !           483:        if (width[j] != w || tally[j] != t)
        !           484:            return (-1);
        !           485: 
        !           486:        match = 1;
        !           487:        for (k = 0; match && k < t; k++)
        !           488:        {
        !           489:            if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
        !           490:                match = 0;
        !           491:        }
        !           492: 
        !           493:        if (match)
        !           494:            return (j);
        !           495:     }
        !           496: 
        !           497:     return (-1);
        !           498: }
        !           499: 
        !           500: 
        !           501: 
        !           502: int
        !           503: pack_vector(vector)
        !           504: int vector;
        !           505: {
        !           506:     register int i, j, k, l;
        !           507:     register int t;
        !           508:     register int loc;
        !           509:     register int ok;
        !           510:     register short *from;
        !           511:     register short *to;
        !           512:     int newmax;
        !           513: 
        !           514:     i = order[vector];
        !           515:     t = tally[i];
        !           516:     assert(t);
        !           517: 
        !           518:     from = froms[i];
        !           519:     to = tos[i];
        !           520: 
        !           521:     j = lowzero - from[0];
        !           522:     for (k = 1; k < t; ++k)
        !           523:        if (lowzero - from[k] > j)
        !           524:            j = lowzero - from[k];
        !           525:     for (;; ++j)
        !           526:     {
        !           527:        if (j == 0)
        !           528:            continue;
        !           529:        ok = 1;
        !           530:        for (k = 0; ok && k < t; k++)
        !           531:        {
        !           532:            loc = j + from[k];
        !           533:            if (loc >= maxtable)
        !           534:            {
        !           535:                if (loc >= MAXTABLE)
        !           536:                    fatal("maximum table size exceeded");
        !           537: 
        !           538:                newmax = maxtable;
        !           539:                do { newmax += 200; } while (newmax <= loc);
        !           540:                table = (short *) realloc(table, newmax*sizeof(short));
        !           541:                if (table == 0) no_space();
        !           542:                check = (short *) realloc(check, newmax*sizeof(short));
        !           543:                if (check == 0) no_space();
        !           544:                for (l  = maxtable; l < newmax; ++l)
        !           545:                {
        !           546:                    table[l] = 0;
        !           547:                    check[l] = -1;
        !           548:                }
        !           549:                maxtable = newmax;
        !           550:            }
        !           551: 
        !           552:            if (check[loc] != -1)
        !           553:                ok = 0;
        !           554:        }
        !           555:        for (k = 0; ok && k < vector; k++)
        !           556:        {
        !           557:            if (pos[k] == j)
        !           558:                ok = 0;
        !           559:        }
        !           560:        if (ok)
        !           561:        {
        !           562:            for (k = 0; k < t; k++)
        !           563:            {
        !           564:                loc = j + from[k];
        !           565:                table[loc] = to[k];
        !           566:                check[loc] = from[k];
        !           567:                if (loc > high) high = loc;
        !           568:            }
        !           569: 
        !           570:            while (check[lowzero] != -1)
        !           571:                ++lowzero;
        !           572: 
        !           573:            return (j);
        !           574:        }
        !           575:     }
        !           576: }
        !           577: 
        !           578: 
        !           579: 
        !           580: output_base()
        !           581: {
        !           582:     register int i, j;
        !           583: 
        !           584:     fprintf(output_file, "short yysindex[] = {%39d,", base[0]);
        !           585: 
        !           586:     j = 10;
        !           587:     for (i = 1; i < nstates; i++)
        !           588:     {
        !           589:        if (j >= 10)
        !           590:        {
        !           591:            ++outline;
        !           592:            putc('\n', output_file);
        !           593:            j = 1;
        !           594:        }
        !           595:        else
        !           596:            ++j;
        !           597: 
        !           598:        fprintf(output_file, "%5d,", base[i]);
        !           599:     }
        !           600: 
        !           601:     outline += 2;
        !           602:     fprintf(output_file, "\n};\nshort yyrindex[] = {%39d,",
        !           603:            base[nstates]);
        !           604: 
        !           605:     j = 10;
        !           606:     for (i = nstates + 1; i < 2*nstates; i++)
        !           607:     {
        !           608:        if (j >= 10)
        !           609:        {
        !           610:            ++outline;
        !           611:            putc('\n', output_file);
        !           612:            j = 1;
        !           613:        }
        !           614:        else
        !           615:            ++j;
        !           616: 
        !           617:        fprintf(output_file, "%5d,", base[i]);
        !           618:     }
        !           619: 
        !           620:     outline += 2;
        !           621:     fprintf(output_file, "\n};\nshort yygindex[] = {%39d,",
        !           622:            base[2*nstates]);
        !           623: 
        !           624:     j = 10;
        !           625:     for (i = 2*nstates + 1; i < nvectors - 1; i++)
        !           626:     {
        !           627:        if (j >= 10)
        !           628:        {
        !           629:            ++outline;
        !           630:            putc('\n', output_file);
        !           631:            j = 1;
        !           632:        }
        !           633:        else
        !           634:            ++j;
        !           635: 
        !           636:        fprintf(output_file, "%5d,", base[i]);
        !           637:     }
        !           638: 
        !           639:     outline += 2;
        !           640:     fprintf(output_file, "\n};\n");
        !           641:     FREE(base);
        !           642: }
        !           643: 
        !           644: 
        !           645: 
        !           646: output_table()
        !           647: {
        !           648:     register int i;
        !           649:     register int j;
        !           650: 
        !           651:     ++outline;
        !           652:     fprintf(output_file, "#define YYTABLESIZE %d\n", high);
        !           653:     fprintf(output_file, "short yytable[] = {%40d,", table[0]);
        !           654: 
        !           655:     j = 10;
        !           656:     for (i = 1; i <= high; i++)
        !           657:     {
        !           658:        if (j >= 10)
        !           659:        {
        !           660:            ++outline;
        !           661:            putc('\n', output_file);
        !           662:            j = 1;
        !           663:        }
        !           664:        else
        !           665:            ++j;
        !           666: 
        !           667:        fprintf(output_file, "%5d,", table[i]);
        !           668:     }
        !           669: 
        !           670:     outline += 2;
        !           671:     fprintf(output_file, "\n};\n");
        !           672:     FREE(table);
        !           673: }
        !           674: 
        !           675: 
        !           676: 
        !           677: output_check()
        !           678: {
        !           679:     register int i;
        !           680:     register int j;
        !           681: 
        !           682:     fprintf(output_file, "short yycheck[] = {%40d,", check[0]);
        !           683: 
        !           684:     j = 10;
        !           685:     for (i = 1; i <= high; i++)
        !           686:     {
        !           687:        if (j >= 10)
        !           688:        {
        !           689:            ++outline;
        !           690:            putc('\n', output_file);
        !           691:            j = 1;
        !           692:        }
        !           693:        else
        !           694:            ++j;
        !           695: 
        !           696:        fprintf(output_file, "%5d,", check[i]);
        !           697:     }
        !           698: 
        !           699:     outline += 2;
        !           700:     fprintf(output_file, "\n};\n");
        !           701:     FREE(check);
        !           702: }
        !           703: 
        !           704: 
        !           705: int
        !           706: is_C_identifier(name)
        !           707: char *name;
        !           708: {
        !           709:     register char *s;
        !           710:     register int c;
        !           711: 
        !           712:     s = name;
        !           713:     c = *s;
        !           714:     if (c == '"')
        !           715:     {
        !           716:        c = *++s;
        !           717:        if (!isalpha(c) && c != '_' && c != '$')
        !           718:            return (0);
        !           719:        while ((c = *++s) != '"')
        !           720:        {
        !           721:            if (!isalnum(c) && c != '_' && c != '$')
        !           722:                return (0);
        !           723:        }
        !           724:        return (1);
        !           725:     }
        !           726: 
        !           727:     if (!isalpha(c) && c != '_' && c != '$')
        !           728:        return (0);
        !           729:     while (c = *++s)
        !           730:     {
        !           731:        if (!isalnum(c) && c != '_' && c != '$')
        !           732:            return (0);
        !           733:     }
        !           734:     return (1);
        !           735: }
        !           736: 
        !           737: 
        !           738: output_defines()
        !           739: {
        !           740:     register int c, i;
        !           741:     register char *s;
        !           742: 
        !           743:     for (i = 2; i < ntokens; ++i)
        !           744:     {
        !           745:        s = symbol_name[i];
        !           746:        if (is_C_identifier(s))
        !           747:        {
        !           748:            fprintf(output_file, "#define ");
        !           749:            if (dflag) fprintf(defines_file, "#define ");
        !           750:            c = *s;
        !           751:            if (c == '"')
        !           752:            {
        !           753:                while ((c = *++s) != '"')
        !           754:                {
        !           755:                    putc(c, output_file);
        !           756:                    if (dflag) putc(c, defines_file);
        !           757:                }
        !           758:            }
        !           759:            else
        !           760:            {
        !           761:                do
        !           762:                {
        !           763:                    putc(c, output_file);
        !           764:                    if (dflag) putc(c, defines_file);
        !           765:                }
        !           766:                while (c = *++s);
        !           767:            }
        !           768:            ++outline;
        !           769:            fprintf(output_file, " %d\n", symbol_value[i]);
        !           770:            if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]);
        !           771:        }
        !           772:     }
        !           773: 
        !           774:     ++outline;
        !           775:     fprintf(output_file, "#define YYERRCODE %d\n", symbol_value[1]);
        !           776: 
        !           777:     if (dflag && unionized)
        !           778:     {
        !           779:        fclose(union_file);
        !           780:        union_file = fopen(union_file_name, "r");
        !           781:        if (union_file == NULL) open_error(union_file_name);
        !           782:        while ((c = getc(union_file)) != EOF)
        !           783:            putc(c, defines_file);
        !           784:        fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE yylval;\n");
        !           785:     }
        !           786: }
        !           787: 
        !           788: 
        !           789: output_stored_text()
        !           790: {
        !           791:     register int c;
        !           792:     register FILE *in, *out;
        !           793: 
        !           794:     fclose(text_file);
        !           795:     text_file = fopen(text_file_name, "r");
        !           796:     if (text_file == NULL) open_error(text_file_name);
        !           797:     in = text_file;
        !           798:     out = output_file;
        !           799:     if ((c = getc(in)) == EOF)
        !           800:        return;
        !           801:     if (c == '\n') ++outline;
        !           802:     putc(c, out);
        !           803:     while ((c = getc(in)) != EOF)
        !           804:     {
        !           805:        if (c == '\n') ++outline;
        !           806:        putc(c, out);
        !           807:     }
        !           808:     if (!lflag)
        !           809:     {
        !           810:        ++outline;
        !           811:        fprintf(out, line_format, outline + 1, output_file_name);
        !           812:     }
        !           813: }
        !           814: 
        !           815: 
        !           816: output_debug()
        !           817: {
        !           818:     register int i, j, k, max;
        !           819:     char **symnam, *s;
        !           820: 
        !           821:     ++outline;
        !           822:     fprintf(output_file, "#define YYFINAL %d\n", final_state);
        !           823:     outline += 3;
        !           824:     fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
        !           825:            tflag);
        !           826: 
        !           827:     max = 0;
        !           828:     for (i = 2; i < ntokens; ++i)
        !           829:        if (symbol_value[i] > max)
        !           830:            max = symbol_value[i];
        !           831:     ++outline;
        !           832:     fprintf(output_file, "#define YYMAXTOKEN %d\n", max);
        !           833: 
        !           834:     symnam = (char **) MALLOC((max+1)*sizeof(char *));
        !           835:     if (symnam == 0) no_space();
        !           836:     for (i = 0; i < max; ++i)
        !           837:        symnam[i] = 0;
        !           838:     for (i = ntokens - 1; i >= 2; --i)
        !           839:        symnam[symbol_value[i]] = symbol_name[i];
        !           840:     symnam[0] = "end-of-file";
        !           841: 
        !           842:     ++outline;
        !           843:     fprintf(output_file, "#if YYDEBUG\nchar *yyname[] = {");
        !           844:     j = 80;
        !           845:     for (i = 0; i <= max; ++i)
        !           846:     {
        !           847:        if (s = symnam[i])
        !           848:        {
        !           849:            if (s[0] == '"')
        !           850:            {
        !           851:                k = 7;
        !           852:                while (*++s != '"')
        !           853:                {
        !           854:                    if (*s == '\\')
        !           855:                    {
        !           856:                        k += 2;
        !           857:                        if (*++s == '\\')
        !           858:                            k += 2;
        !           859:                        else
        !           860:                            ++k;
        !           861:                    }
        !           862:                    else
        !           863:                        ++k;
        !           864:                }
        !           865:                j += k;
        !           866:                if (j > 80)
        !           867:                {
        !           868:                    ++outline;
        !           869:                    putc('\n', output_file);
        !           870:                    j = k;
        !           871:                }
        !           872:                fprintf(output_file, "\"\\\"");
        !           873:                s = symnam[i];
        !           874:                while (*++s != '"')
        !           875:                {
        !           876:                    if (*s == '\\')
        !           877:                    {
        !           878:                        fprintf(output_file, "\\\\");
        !           879:                        if (*++s == '\\')
        !           880:                            fprintf(output_file, "\\\\");
        !           881:                        else
        !           882:                            putc(*s, output_file);
        !           883:                    }
        !           884:                    else
        !           885:                        putc(*s, output_file);
        !           886:                }
        !           887:                fprintf(output_file, "\\\"\",");
        !           888:            }
        !           889:            else if (s[0] == '\'')
        !           890:            {
        !           891:                if (s[1] == '"')
        !           892:                {
        !           893:                    j += 7;
        !           894:                    if (j > 80)
        !           895:                    {
        !           896:                        ++outline;
        !           897:                        putc('\n', output_file);
        !           898:                        j = 7;
        !           899:                    }
        !           900:                    fprintf(output_file, "\"'\\\"'\",");
        !           901:                }
        !           902:                else
        !           903:                {
        !           904:                    k = 5;
        !           905:                    while (*++s != '\'')
        !           906:                    {
        !           907:                        if (*s == '\\')
        !           908:                        {
        !           909:                            k += 2;
        !           910:                            ++s;
        !           911:                            if (*++s == '\\')
        !           912:                                k += 2;
        !           913:                            else
        !           914:                                ++k;
        !           915:                        }
        !           916:                        else
        !           917:                            ++k;
        !           918:                    }
        !           919:                    j += k;
        !           920:                    if (j > 80)
        !           921:                    {
        !           922:                        ++outline;
        !           923:                        putc('\n', output_file);
        !           924:                        j = k;
        !           925:                    }
        !           926:                    fprintf(output_file, "\"'");
        !           927:                    s = symnam[i];
        !           928:                    while (*++s != '\'')
        !           929:                    {
        !           930:                        if (*s == '\\')
        !           931:                        {
        !           932:                            fprintf(output_file, "\\\\");
        !           933:                            if (*++s == '\\')
        !           934:                                fprintf(output_file, "\\\\");
        !           935:                            else
        !           936:                                putc(*s, output_file);
        !           937:                        }
        !           938:                        else
        !           939:                            putc(*s, output_file);
        !           940:                    }
        !           941:                    fprintf(output_file, "'\",");
        !           942:                }
        !           943:            }
        !           944:            else
        !           945:            {
        !           946:                k = strlen(s) + 3;
        !           947:                j += k;
        !           948:                if (j > 80)
        !           949:                {
        !           950:                    ++outline;
        !           951:                    putc('\n', output_file);
        !           952:                    j = k;
        !           953:                }
        !           954:                putc('"', output_file);
        !           955:                do { putc(*s, output_file); } while (*++s);
        !           956:                fprintf(output_file, "\",");
        !           957:            }
        !           958:        }
        !           959:        else
        !           960:        {
        !           961:            j += 2;
        !           962:            if (j > 80)
        !           963:            {
        !           964:                ++outline;
        !           965:                putc('\n', output_file);
        !           966:                j = 2;
        !           967:            }
        !           968:            fprintf(output_file, "0,");
        !           969:        }
        !           970:     }
        !           971:     outline += 2;
        !           972:     fprintf(output_file, "\n};\n");
        !           973:     FREE(symnam);
        !           974: 
        !           975:     ++outline;
        !           976:     fprintf(output_file, "char *yyrule[] = {\n");
        !           977:     for (i = 2; i < nrules; ++i)
        !           978:     {
        !           979:        fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
        !           980:        for (j = rrhs[i]; ritem[j] > 0; ++j)
        !           981:        {
        !           982:            s = symbol_name[ritem[j]];
        !           983:            if (s[0] == '"')
        !           984:            {
        !           985:                fprintf(output_file, " \\\"");
        !           986:                while (*++s != '"')
        !           987:                {
        !           988:                    if (*s == '\\')
        !           989:                    {
        !           990:                        if (s[1] == '\\')
        !           991:                            fprintf(output_file, "\\\\\\\\");
        !           992:                        else
        !           993:                            fprintf(output_file, "\\\\%c", s[1]);
        !           994:                        ++s;
        !           995:                    }
        !           996:                    else
        !           997:                        putc(*s, output_file);
        !           998:                }
        !           999:                fprintf(output_file, "\\\"");
        !          1000:            }
        !          1001:            else if (s[0] == '\'')
        !          1002:            {
        !          1003:                if (s[1] == '"')
        !          1004:                    fprintf(output_file, " '\\\"'");
        !          1005:                else if (s[1] == '\\')
        !          1006:                {
        !          1007:                    if (s[2] == '\\')
        !          1008:                        fprintf(output_file, " '\\\\\\\\");
        !          1009:                    else
        !          1010:                        fprintf(output_file, " '\\\\%c", s[2]);
        !          1011:                    s += 2;
        !          1012:                    while (*++s != '\'')
        !          1013:                        putc(*s, output_file);
        !          1014:                    putc('\'', output_file);
        !          1015:                }
        !          1016:                else
        !          1017:                    fprintf(output_file, " '%c'", s[1]);
        !          1018:            }
        !          1019:            else
        !          1020:                fprintf(output_file, " %s", s);
        !          1021:        }
        !          1022:        ++outline;
        !          1023:        fprintf(output_file, "\",\n");
        !          1024:     }
        !          1025: 
        !          1026:     outline += 2;
        !          1027:     fprintf(output_file, "};\n#endif\n");
        !          1028: }
        !          1029: 
        !          1030: 
        !          1031: output_stype()
        !          1032: {
        !          1033:     if (!unionized && ntags == 0)
        !          1034:     {
        !          1035:        outline += 3;
        !          1036:        fprintf(output_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n");
        !          1037:     }
        !          1038: }
        !          1039: 
        !          1040: 
        !          1041: output_trailing_text()
        !          1042: {
        !          1043:     register int c, last;
        !          1044: 
        !          1045:     if (line == 0)
        !          1046:        return;
        !          1047: 
        !          1048:     c = *cptr;
        !          1049:     if (c == '\n')
        !          1050:     {
        !          1051:        ++lineno;
        !          1052:        if ((c = getc(input_file)) == EOF)
        !          1053:            return;
        !          1054:        if (!lflag)
        !          1055:        {
        !          1056:            ++outline;
        !          1057:            fprintf(output_file, line_format, lineno, input_file_name);
        !          1058:        }
        !          1059:        if (c == '\n') ++outline;
        !          1060:        putc(c, output_file);
        !          1061:        last = c;
        !          1062:     }
        !          1063:     else
        !          1064:     {
        !          1065:        if (!lflag)
        !          1066:        {
        !          1067:            ++outline;
        !          1068:            fprintf(output_file, line_format, lineno, input_file_name);
        !          1069:        }
        !          1070:        do { putc(c, output_file); } while ((c = *++cptr) != '\n');
        !          1071:        ++outline;
        !          1072:        putc('\n', output_file);
        !          1073:        last = '\n';
        !          1074:     }
        !          1075: 
        !          1076:     while ((c = getc(input_file)) != EOF)
        !          1077:     {
        !          1078:        if (c == '\n') ++outline;
        !          1079:        putc(c, output_file);
        !          1080:        last = c;
        !          1081:     }
        !          1082: 
        !          1083:     if (last != '\n')
        !          1084:     {
        !          1085:        ++outline;
        !          1086:        putc('\n', output_file);
        !          1087:     }
        !          1088:     if (!lflag)
        !          1089:     {
        !          1090:        ++outline;
        !          1091:        fprintf(output_file, line_format, outline + 1, output_file_name);
        !          1092:     }
        !          1093: }
        !          1094: 
        !          1095: 
        !          1096: output_semantic_actions()
        !          1097: {
        !          1098:     register int c, last;
        !          1099: 
        !          1100:     fclose(action_file);
        !          1101:     action_file = fopen(action_file_name, "r");
        !          1102:     if (action_file == NULL) open_error(action_file_name);
        !          1103: 
        !          1104:     if ((c = getc(action_file)) == EOF)
        !          1105:        return;
        !          1106:     last = c;
        !          1107:     if (c == '\n') ++outline;
        !          1108:     putc(c, output_file);
        !          1109:     while ((c = getc(action_file)) != EOF)
        !          1110:     {
        !          1111:        if (c == '\n') ++outline;
        !          1112:        putc(c, output_file);
        !          1113:        last = c;
        !          1114:     }
        !          1115: 
        !          1116:     if (last != '\n')
        !          1117:     {
        !          1118:        ++outline;
        !          1119:        putc('\n', output_file);
        !          1120:     }
        !          1121:     if (!lflag)
        !          1122:     {
        !          1123:        ++outline;
        !          1124:        fprintf(output_file, line_format, outline + 1, output_file_name);
        !          1125:     }
        !          1126: }
        !          1127: 
        !          1128: 
        !          1129: free_itemsets()
        !          1130: {
        !          1131:     register core *cp, *next;
        !          1132: 
        !          1133:     FREE(state_table);
        !          1134:     for (cp = first_state; cp; cp = next)
        !          1135:     {
        !          1136:        next = cp->next;
        !          1137:        FREE(cp);
        !          1138:     }
        !          1139: }
        !          1140: 
        !          1141: 
        !          1142: free_shifts()
        !          1143: {
        !          1144:     register shifts *sp, *next;
        !          1145: 
        !          1146:     FREE(shift_table);
        !          1147:     for (sp = first_shift; sp; sp = next)
        !          1148:     {
        !          1149:        next = sp->next;
        !          1150:        FREE(sp);
        !          1151:     }
        !          1152: }
        !          1153: 
        !          1154: 
        !          1155: 
        !          1156: free_reductions()
        !          1157: {
        !          1158:     register reductions *rp, *next;
        !          1159: 
        !          1160:     FREE(reduction_table);
        !          1161:     for (rp = first_reduction; rp; rp = next)
        !          1162:     {
        !          1163:        next = rp->next;
        !          1164:        FREE(rp);
        !          1165:     }
        !          1166: }

unix.superglobalmegacorp.com

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