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

1.1       root        1: /* Output the generated parsing program 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: /* functions to output parsing data to various files.  Entries are:
                     22: 
                     23:   output_headers ()
                     24: 
                     25: Output constant strings to the beginning of certain files.
                     26: 
                     27:   output_trailers()
                     28: 
                     29: Output constant strings to the ends of certain files.
                     30: 
                     31:   output ()
                     32: 
                     33: Output the parsing tables and the parser code to ftable.
                     34: 
                     35: The parser tables consist of these tables.
                     36: Starred ones needed only for the semantic parser.
                     37: 
                     38: yytranslate = vector mapping yylex's token numbers into bison's token numbers.
                     39: 
                     40: yytname = vector of string-names indexed by bison token number
                     41: 
                     42: yyrline = vector of line-numbers of all rules.  For yydebug printouts.
                     43: 
                     44: yyrhs = vector of items of all rules.
                     45:         This is exactly what ritems contains.  For yydebug and for semantic
                     46:        parser.
                     47: 
                     48: yyprhs[r] = index in yyrhs of first item for rule r.
                     49: 
                     50: yyr1[r] = symbol number of symbol that rule r derives.
                     51: 
                     52: yyr2[r] = number of symbols composing right hand side of rule r.
                     53: 
                     54: * yystos[s] = the symbol number of the symbol that leads to state s.
                     55: 
                     56: yydefact[s] = default rule to reduce with in state s,
                     57:              when yytable doesn't specify something else to do.
                     58:              Zero means the default is an error.
                     59: 
                     60: yydefgoto[i] = default state to go to after a reduction of a rule that
                     61:               generates variable ntokens + i, except when yytable
                     62:               specifies something else to do.
                     63: 
                     64: yypact[s] = index in yytable of the portion describing state s.
                     65:             The lookahead token's type is used to index that portion
                     66:             to find out what to do.
                     67: 
                     68:            If the value in yytable is positive,
                     69:            we shift the token and go to that state.
                     70: 
                     71:            If the value is negative, it is minus a rule number to reduce by.
                     72: 
                     73:            If the value is zero, the default action from yydefact[s] is used.
                     74: 
                     75: yypgoto[i] = the index in yytable of the portion describing 
                     76:              what to do after reducing a rule that derives variable i + ntokens.
                     77:              This portion is indexed by the parser state number
                     78:             as of before the text for this nonterminal was read.
                     79:             The value from yytable is the state to go to.
                     80: 
                     81: yytable = a vector filled with portions for different uses,
                     82:           found via yypact and yypgoto.
                     83: 
                     84: yycheck = a vector indexed in parallel with yytable.
                     85:          It indicates, in a roundabout way, the bounds of the
                     86:          portion you are trying to examine.
                     87: 
                     88:          Suppose that the portion of yytable starts at index p
                     89:          and the index to be examined within the portion is i.
                     90:          Then if yycheck[p+i] != i, i is outside the bounds
                     91:          of what is actually allocated, and the default
                     92:          (from yydefact or yydefgoto) should be used.
                     93:          Otherwise, yytable[p+i] should be used.
                     94: 
                     95: YYFINAL = the state number of the termination state.
                     96: YYFLAG = most negative short int.  Used to flag ??
                     97: YYNTBASE = ntokens.
                     98: 
                     99: */
                    100: 
                    101: #include <stdio.h>
                    102: #include "system.h"
                    103: #include "machine.h"
                    104: #include "new.h"
                    105: #include "files.h"
                    106: #include "gram.h"
                    107: #include "state.h"
                    108: 
                    109: 
                    110: extern int debugflag;
                    111: extern int nolinesflag;
                    112: 
                    113: extern char **tags;
                    114: extern int tokensetsize;
                    115: extern int final_state;
                    116: extern core **state_table;
                    117: extern shifts **shift_table;
                    118: extern errs **err_table;
                    119: extern reductions **reduction_table;
                    120: extern short *accessing_symbol;
                    121: extern unsigned *LA;
                    122: extern short *LAruleno;
                    123: extern short *lookaheads;
                    124: extern char *consistent;
                    125: extern short *goto_map;
                    126: extern short *from_state;
                    127: extern short *to_state;
                    128: 
                    129: void output_token_translations();
                    130: void output_gram();
                    131: void output_stos();
                    132: void output_rule_data();
                    133: void output_defines();
                    134: void output_actions();
                    135: void token_actions();
                    136: void save_row();
                    137: void goto_actions();
                    138: void save_column();
                    139: void sort_actions();
                    140: void pack_table();
                    141: void output_base();
                    142: void output_table();
                    143: void output_check();
                    144: void output_parser();
                    145: void output_program();
                    146: void free_itemset();
                    147: void free_shifts();
                    148: void free_reductions();
                    149: void free_itemsets();
                    150: int action_row();
                    151: int default_goto();
                    152: int matching_state();
                    153: int pack_vector();
                    154: 
                    155: extern void berror();
                    156: extern void fatals();
                    157: 
                    158: static int nvectors;
                    159: static int nentries;
                    160: static short **froms;
                    161: static short **tos;
                    162: static short *tally;
                    163: static short *width;
                    164: static short *actrow;
                    165: static short *state_count;
                    166: static short *order;
                    167: static short *base;
                    168: static short *pos;
                    169: static short *table;
                    170: static short *check;
                    171: static int lowzero;
                    172: static int high;
                    173: 
                    174: 
                    175: 
                    176: #define        GUARDSTR        "\n#include \"%s\"\nextern int yyerror;\n\
                    177: extern int yycost;\nextern char * yymsg;\nextern YYSTYPE yyval;\n\n\
                    178: yyguard(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\
                    179: register YYLTYPE *yylsp;\n\
                    180: {\n  yyerror = 0;\nyycost = 0;\n  yymsg = 0;\nswitch (n)\n    {"
                    181: 
                    182: #define        ACTSTR          "\n#include \"%s\"\nextern YYSTYPE yyval;\
                    183: \nextern int yychar;\
                    184: yyaction(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\
                    185: register YYLTYPE *yylsp;\n{\n  switch (n)\n{"
                    186: 
                    187: #define        ACTSTR_SIMPLE   "\n  switch (yyn) {\n"
                    188: 
                    189: 
                    190: void
                    191: output_headers()
                    192: {
                    193:   if (semantic_parser)
                    194:     fprintf(fguard, GUARDSTR, attrsfile);
                    195:   fprintf(faction, (semantic_parser ? ACTSTR : ACTSTR_SIMPLE), attrsfile);
                    196: /*  if (semantic_parser)       JF moved this below
                    197:     fprintf(ftable, "#include \"%s\"\n", attrsfile);
                    198:   fprintf(ftable, "#include <stdio.h>\n\n");
                    199: */
                    200: 
                    201:   /* Rename certain symbols if -p was specified.  */
                    202:   if (spec_name_prefix)
                    203:     {
                    204:       fprintf(ftable, "#define yyparse %sparse\n", spec_name_prefix);
                    205:       fprintf(ftable, "#define yylex %slex\n", spec_name_prefix);
                    206:       fprintf(ftable, "#define yyerror %serror\n", spec_name_prefix);
                    207:       fprintf(ftable, "#define yylval %slval\n", spec_name_prefix);
                    208:       fprintf(ftable, "#define yychar %schar\n", spec_name_prefix);
                    209:       fprintf(ftable, "#define yydebug %sdebug\n", spec_name_prefix);
                    210:       fprintf(ftable, "#define yynerrs %snerrs\n", spec_name_prefix);
                    211:     }
                    212: }
                    213: 
                    214: 
                    215: void
                    216: output_trailers()
                    217: {
                    218:   if (semantic_parser)
                    219:     {
                    220:       fprintf(fguard, "\n    }\n}\n");
                    221:       fprintf(faction, "\n    }\n}\n");
                    222:     }
                    223:   else
                    224:     fprintf(faction, "\n}\n");
                    225: }
                    226: 
                    227: 
                    228: void
                    229: output()
                    230: {
                    231:   int c;
                    232: 
                    233:   /* output_token_defines(ftable);     / * JF put out token defines FIRST */
                    234:   if (!semantic_parser)                /* JF Put out other stuff */
                    235:     {
                    236:       rewind(fattrs);
                    237:       while ((c=getc(fattrs))!=EOF)
                    238:         putc(c,ftable);
                    239:     }
                    240: 
                    241:   if (debugflag)
                    242:     fprintf(ftable, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n\n",
                    243:            !!debugflag);
                    244: 
                    245:   if (semantic_parser)
                    246:     fprintf(ftable, "#include \"%s\"\n", attrsfile);
                    247:   fprintf(ftable, "#include <stdio.h>\n\n");
                    248: 
                    249:   /* Make "const" do nothing if not in ANSI C.  */
                    250:   fprintf (ftable, "#ifndef __cplusplus\n#ifndef __STDC__\n#define const\n#endif\n#endif\n\n");
                    251: 
                    252:   free_itemsets();
                    253:   output_defines();
                    254:   output_token_translations();
                    255: /*   if (semantic_parser) */
                    256:   /* This is now unconditional because debugging printouts can use it.  */
                    257:   output_gram();
                    258:   FREE(ritem);
                    259:   if (semantic_parser)
                    260:     output_stos();
                    261:   output_rule_data();
                    262:   output_actions();
                    263:   output_parser();
                    264:   output_program();
                    265: }
                    266: 
                    267: 
                    268: void
                    269: output_token_translations()
                    270: {
                    271:   register int i, j;
                    272: /*   register short *sp; JF unused */
                    273: 
                    274:   if (translations)
                    275:     {
                    276:       fprintf(ftable,
                    277:              "\n#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\n",
                    278:              max_user_token_number, nsyms);
                    279:     
                    280:       if (ntokens < 127)  /* play it very safe; check maximum element value.  */
                    281:         fprintf(ftable, "\nstatic const char yytranslate[] = {     0");
                    282:       else
                    283:        fprintf(ftable, "\nstatic const short yytranslate[] = {     0");
                    284:     
                    285:       j = 10;
                    286:       for (i = 1; i <= max_user_token_number; i++)
                    287:        {
                    288:          putc(',', ftable);
                    289:     
                    290:          if (j >= 10)
                    291:            {
                    292:              putc('\n', ftable);
                    293:              j = 1;
                    294:            }
                    295:          else
                    296:            {
                    297:              j++;
                    298:            }
                    299:     
                    300:          fprintf(ftable, "%6d", token_translations[i]);
                    301:        }
                    302:     
                    303:       fprintf(ftable, "\n};\n");
                    304:     }
                    305:   else
                    306:     {
                    307:       fprintf(ftable, "\n#define YYTRANSLATE(x) (x)\n");
                    308:     } 
                    309: }
                    310: 
                    311: 
                    312: void
                    313: output_gram()
                    314: {
                    315:   register int i;
                    316:   register int j;
                    317:   register short *sp;
                    318: 
                    319:   /* With the ordinary parser,
                    320:      yyprhs and yyrhs are needed only for yydebug.  */
                    321:   if (!semantic_parser)
                    322:     fprintf(ftable, "\n#if YYDEBUG != 0");
                    323: 
                    324:   fprintf(ftable, "\nstatic const short yyprhs[] = {     0");
                    325: 
                    326:   j = 10;
                    327:   for (i = 1; i <= nrules; i++)
                    328:     {
                    329:       putc(',', ftable);
                    330: 
                    331:       if (j >= 10)
                    332:        {
                    333:          putc('\n', ftable);
                    334:          j = 1;
                    335:        }
                    336:       else
                    337:        {
                    338:          j++;
                    339:        }
                    340: 
                    341:       fprintf(ftable, "%6d", rrhs[i]);
                    342:     }
                    343: 
                    344:   fprintf(ftable, "\n};\n");
                    345: 
                    346:   fprintf(ftable, "\nstatic const short yyrhs[] = {%6d", ritem[0]);
                    347: 
                    348:   j = 10;
                    349:   for (sp = ritem + 1; *sp; sp++)
                    350:     {
                    351:       putc(',', ftable);
                    352: 
                    353:       if (j >= 10)
                    354:        {
                    355:          putc('\n', ftable);
                    356:          j = 1;
                    357:        }
                    358:       else
                    359:        {
                    360:          j++;
                    361:        }
                    362: 
                    363:       if (*sp > 0)
                    364:        fprintf(ftable, "%6d", *sp);
                    365:       else
                    366:        fprintf(ftable, "     0");
                    367:     }
                    368: 
                    369:   fprintf(ftable, "\n};\n");
                    370: 
                    371:   if(!semantic_parser)
                    372:     fprintf(ftable, "\n#endif\n");
                    373: }
                    374: 
                    375: 
                    376: void
                    377: output_stos()
                    378: {
                    379:   register int i;
                    380:   register int j;
                    381: 
                    382:   fprintf(ftable, "\nstatic const short yystos[] = {     0");
                    383: 
                    384:   j = 10;
                    385:   for (i = 1; i < nstates; i++)
                    386:     {
                    387:       putc(',', ftable);
                    388: 
                    389:       if (j >= 10)
                    390:        {
                    391:          putc('\n', ftable);
                    392:          j = 1;
                    393:        }
                    394:       else
                    395:        {
                    396:          j++;
                    397:        }
                    398: 
                    399:       fprintf(ftable, "%6d", accessing_symbol[i]);
                    400:     }
                    401: 
                    402:   fprintf(ftable, "\n};\n");
                    403: }
                    404: 
                    405: 
                    406: void
                    407: output_rule_data()
                    408: {
                    409:   register int i;
                    410:   register int j;
                    411: 
                    412:   fprintf(ftable, "\n#if YYDEBUG != 0\nstatic const short yyrline[] = { 0");
                    413: 
                    414:   j = 10;
                    415:   for (i = 1; i <= nrules; i++)
                    416:     {
                    417:       putc(',', ftable);
                    418: 
                    419:       if (j >= 10)
                    420:        {
                    421:          putc('\n', ftable);
                    422:          j = 1;
                    423:        }
                    424:       else
                    425:        {
                    426:          j++;
                    427:        }
                    428: 
                    429:       fprintf(ftable, "%6d", rline[i]);
                    430:     }
                    431: 
                    432:   /* Output the table of symbol names.  */
                    433: 
                    434:   fprintf(ftable,
                    435:           "\n};\n\nstatic const char * const yytname[] = {   \"%s\"",
                    436:           tags[0]);
                    437: 
                    438:   j = strlen (tags[0]) + 44;
                    439:   for (i = 1; i <= nsyms; i++)
                    440:     {
                    441:       register char *p;
                    442:       putc(',', ftable);
                    443:       j++;
                    444: 
                    445:       if (j > 75)
                    446:        {
                    447:          putc('\n', ftable);
                    448:          j = 0;
                    449:        }
                    450: 
                    451:       putc ('\"', ftable);
                    452:       j++;
                    453: 
                    454:       for (p = tags[i]; p && *p; p++)
                    455:        {
                    456:          if (*p == '"' || *p == '\\')
                    457:            {
                    458:              fprintf(ftable, "\\%c", *p);
                    459:              j += 2;
                    460:            }
                    461:          else if (*p == '\n')
                    462:            {
                    463:              fprintf(ftable, "\\n");
                    464:              j += 2;
                    465:            }
                    466:          else if (*p == '\t')
                    467:            {
                    468:              fprintf(ftable, "\\t");
                    469:              j += 2;
                    470:            }
                    471:          else if (*p == '\b')
                    472:            {
                    473:              fprintf(ftable, "\\b");
                    474:              j += 2;
                    475:            }
                    476:          else if (*p < 040 || *p >= 0177)
                    477:            {
                    478:              fprintf(ftable, "\\%03o", *p);
                    479:              j += 4;
                    480:            }
                    481:          else
                    482:            {
                    483:              putc(*p, ftable);
                    484:              j++;
                    485:            }
                    486:        }
                    487: 
                    488:       putc ('\"', ftable);
                    489:       j++;
                    490:     }
                    491: 
                    492:   fprintf(ftable, "\n};\n#endif\n\nstatic const short yyr1[] = {     0");
                    493: 
                    494:   j = 10;
                    495:   for (i = 1; i <= nrules; i++)
                    496:     {
                    497:       putc(',', ftable);
                    498: 
                    499:       if (j >= 10)
                    500:        {
                    501:          putc('\n', ftable);
                    502:          j = 1;
                    503:        }
                    504:       else
                    505:        {
                    506:          j++;
                    507:        }
                    508: 
                    509:       fprintf(ftable, "%6d", rlhs[i]);
                    510:     }
                    511: 
                    512:   FREE(rlhs + 1);
                    513: 
                    514:   fprintf(ftable, "\n};\n\nstatic const short yyr2[] = {     0");
                    515: 
                    516:   j = 10;
                    517:   for (i = 1; i < nrules; i++)
                    518:     {
                    519:       putc(',', ftable);
                    520: 
                    521:       if (j >= 10)
                    522:        {
                    523:          putc('\n', ftable);
                    524:          j = 1;
                    525:        }
                    526:       else
                    527:        {
                    528:          j++;
                    529:        }
                    530: 
                    531:       fprintf(ftable, "%6d", rrhs[i + 1] - rrhs[i] - 1);
                    532:     }
                    533: 
                    534:   putc(',', ftable);
                    535:   if (j >= 10)
                    536:     putc('\n', ftable);
                    537: 
                    538:   fprintf(ftable, "%6d\n};\n", nitems - rrhs[nrules] - 1);
                    539:   FREE(rrhs + 1);
                    540: }
                    541: 
                    542: 
                    543: void
                    544: output_defines()
                    545: {
                    546:   fprintf(ftable, "\n\n#define\tYYFINAL\t\t%d\n", final_state);
                    547:   fprintf(ftable, "#define\tYYFLAG\t\t%d\n", MINSHORT);
                    548:   fprintf(ftable, "#define\tYYNTBASE\t%d\n", ntokens);
                    549: }
                    550: 
                    551: 
                    552: 
                    553: /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable and yycheck.  */
                    554: 
                    555: void
                    556: output_actions()
                    557: {
                    558:   nvectors = nstates + nvars;
                    559: 
                    560:   froms = NEW2(nvectors, short *);
                    561:   tos = NEW2(nvectors, short *);
                    562:   tally = NEW2(nvectors, short);
                    563:   width = NEW2(nvectors, short);
                    564: 
                    565:   token_actions();
                    566:   free_shifts();
                    567:   free_reductions();
                    568:   FREE(lookaheads);
                    569:   FREE(LA);
                    570:   FREE(LAruleno);
                    571:   FREE(accessing_symbol);
                    572: 
                    573:   goto_actions();
                    574:   FREE(goto_map + ntokens);
                    575:   FREE(from_state);
                    576:   FREE(to_state);
                    577: 
                    578:   sort_actions();
                    579:   pack_table();
                    580:   output_base();
                    581:   output_table();
                    582:   output_check();
                    583: }
                    584: 
                    585: 
                    586: 
                    587: /* figure out the actions for the specified state, indexed by lookahead token type.
                    588: 
                    589:    The yydefact table is output now.  The detailed info
                    590:    is saved for putting into yytable later.  */
                    591: 
                    592: void
                    593: token_actions()
                    594: {
                    595:   register int i;
                    596:   register int j;
                    597:   register int k;
                    598: 
                    599:   actrow = NEW2(ntokens, short);
                    600: 
                    601:   k = action_row(0);
                    602:   fprintf(ftable, "\nstatic const short yydefact[] = {%6d", k);
                    603:   save_row(0);
                    604: 
                    605:   j = 10;
                    606:   for (i = 1; i < nstates; i++)
                    607:     {
                    608:       putc(',', ftable);
                    609: 
                    610:       if (j >= 10)
                    611:        {
                    612:          putc('\n', ftable);
                    613:          j = 1;
                    614:        }
                    615:       else
                    616:        {
                    617:          j++;
                    618:        }
                    619: 
                    620:       k = action_row(i);
                    621:       fprintf(ftable, "%6d", k);
                    622:       save_row(i);
                    623:     }
                    624: 
                    625:   fprintf(ftable, "\n};\n");
                    626:   FREE(actrow);
                    627: }
                    628: 
                    629: 
                    630: 
                    631: /* Decide what to do for each type of token if seen as the lookahead token in specified state.
                    632:    The value returned is used as the default action (yydefact) for the state.
                    633:    In addition, actrow is filled with what to do for each kind of token,
                    634:    index by symbol number, with zero meaning do the default action.
                    635:    The value MINSHORT, a very negative number, means this situation
                    636:    is an error.  The parser recognizes this value specially.
                    637: 
                    638:    This is where conflicts are resolved.  The loop over lookahead rules
                    639:    considered lower-numbered rules last, and the last rule considered that likes
                    640:    a token gets to handle it.  */
                    641: 
                    642: int
                    643: action_row(state)
                    644: int state;
                    645: {
                    646:   register int i;
                    647:   register int j;
                    648:   register int k;
                    649:   register int m;
                    650:   register int n;
                    651:   register int count;
                    652:   register int default_rule;
                    653:   register int nreds;
                    654:   register int max;
                    655:   register int rule;
                    656:   register int shift_state;
                    657:   register int symbol;
                    658:   register unsigned mask;
                    659:   register unsigned *wordp;
                    660:   register reductions *redp;
                    661:   register shifts *shiftp;
                    662:   register errs *errp;
                    663:   int nodefault = 0;  /* set nonzero to inhibit having any default reduction */
                    664: 
                    665:   for (i = 0; i < ntokens; i++)
                    666:     actrow[i] = 0;
                    667: 
                    668:   default_rule = 0;
                    669:   nreds = 0;
                    670:   redp = reduction_table[state];
                    671: 
                    672:   if (redp)
                    673:     {
                    674:       nreds = redp->nreds;
                    675: 
                    676:       if (nreds >= 1)
                    677:        {
                    678:          /* loop over all the rules available here which require lookahead */
                    679:          m = lookaheads[state];
                    680:          n = lookaheads[state + 1];
                    681: 
                    682:          for (i = n - 1; i >= m; i--)
                    683:            {
                    684:              rule = - LAruleno[i];
                    685:              wordp = LA + i * tokensetsize;
                    686:              mask = 1;
                    687: 
                    688:              /* and find each token which the rule finds acceptable to come next */
                    689:              for (j = 0; j < ntokens; j++)
                    690:                {
                    691:                  /* and record this rule as the rule to use if that token follows.  */
                    692:                  if (mask & *wordp)
                    693:                    actrow[j] = rule;
                    694: 
                    695:                  mask <<= 1;
                    696:                  if (mask == 0)
                    697:                    {
                    698:                      mask = 1;
                    699:                      wordp++;
                    700:                    }
                    701:                }
                    702:            }
                    703:        }
                    704:     }
                    705: 
                    706:   shiftp = shift_table[state];
                    707: 
                    708:   /* now see which tokens are allowed for shifts in this state.
                    709:      For them, record the shift as the thing to do.  So shift is preferred to reduce.  */
                    710: 
                    711:   if (shiftp)
                    712:     {
                    713:       k = shiftp->nshifts;
                    714: 
                    715:       for (i = 0; i < k; i++)
                    716:        {
                    717:          shift_state = shiftp->shifts[i];
                    718:          if (! shift_state) continue;
                    719: 
                    720:          symbol = accessing_symbol[shift_state];
                    721: 
                    722:          if (ISVAR(symbol))
                    723:            break;
                    724: 
                    725:          actrow[symbol] = shift_state;
                    726: 
                    727:          /* do not use any default reduction if there is a shift for error */
                    728: 
                    729:          if (symbol == error_token_number) nodefault = 1;
                    730:        }
                    731:     }
                    732: 
                    733:   errp = err_table[state];
                    734: 
                    735:   /* See which tokens are an explicit error in this state
                    736:      (due to %nonassoc).  For them, record MINSHORT as the action.  */
                    737: 
                    738:   if (errp)
                    739:     {
                    740:       k = errp->nerrs;
                    741: 
                    742:       for (i = 0; i < k; i++)
                    743:        {
                    744:          symbol = errp->errs[i];
                    745:          actrow[symbol] = MINSHORT;
                    746:        }
                    747:     }
                    748: 
                    749:   /* now find the most common reduction and make it the default action for this state.  */
                    750: 
                    751:   if (nreds >= 1 && ! nodefault)
                    752:     {
                    753:       if (consistent[state])
                    754:        default_rule = redp->rules[0];
                    755:       else
                    756:        {
                    757:          max = 0;
                    758:          for (i = m; i < n; i++)
                    759:            {
                    760:              count = 0;
                    761:              rule = - LAruleno[i];
                    762:     
                    763:              for (j = 0; j < ntokens; j++)
                    764:                {
                    765:                  if (actrow[j] == rule)
                    766:                    count++;
                    767:                }
                    768:     
                    769:              if (count > max)
                    770:                {
                    771:                  max = count;
                    772:                  default_rule = rule;
                    773:                }
                    774:            }
                    775:     
                    776:          /* actions which match the default are replaced with zero,
                    777:             which means "use the default" */
                    778:     
                    779:          if (max > 0)
                    780:            {
                    781:              for (j = 0; j < ntokens; j++)
                    782:                {
                    783:                  if (actrow[j] == default_rule)
                    784:                    actrow[j] = 0;
                    785:                }
                    786:     
                    787:              default_rule = - default_rule;
                    788:            }
                    789:        }
                    790:     }
                    791: 
                    792:   /* If have no default rule, the default is an error.
                    793:      So replace any action which says "error" with "use default".  */
                    794: 
                    795:   if (default_rule == 0)
                    796:     for (j = 0; j < ntokens; j++)
                    797:       {
                    798:        if (actrow[j] == MINSHORT)
                    799:          actrow[j] = 0;
                    800:       }
                    801: 
                    802:   return (default_rule);
                    803: }
                    804: 
                    805: 
                    806: void
                    807: save_row(state)
                    808: int state;
                    809: {
                    810:   register int i;
                    811:   register int count;
                    812:   register short *sp;
                    813:   register short *sp1;
                    814:   register short *sp2;
                    815: 
                    816:   count = 0;
                    817:   for (i = 0; i < ntokens; i++)
                    818:     {
                    819:       if (actrow[i] != 0)
                    820:        count++;
                    821:     }
                    822: 
                    823:   if (count == 0)
                    824:     return;
                    825: 
                    826:   froms[state] = sp1 = sp = NEW2(count, short);
                    827:   tos[state] = sp2 = NEW2(count, short);
                    828: 
                    829:   for (i = 0; i < ntokens; i++)
                    830:     {
                    831:       if (actrow[i] != 0)
                    832:        {
                    833:          *sp1++ = i;
                    834:          *sp2++ = actrow[i];
                    835:        }
                    836:     }
                    837: 
                    838:   tally[state] = count;
                    839:   width[state] = sp1[-1] - sp[0] + 1;
                    840: }
                    841: 
                    842: 
                    843: 
                    844: /* figure out what to do after reducing with each rule,
                    845:    depending on the saved state from before the beginning
                    846:    of parsing the data that matched this rule.
                    847: 
                    848:    The yydefgoto table is output now.  The detailed info
                    849:    is saved for putting into yytable later.  */
                    850: 
                    851: void
                    852: goto_actions()
                    853: {
                    854:   register int i;
                    855:   register int j;
                    856:   register int k;
                    857: 
                    858:   state_count = NEW2(nstates, short);
                    859: 
                    860:   k = default_goto(ntokens);
                    861:   fprintf(ftable, "\nstatic const short yydefgoto[] = {%6d", k);
                    862:   save_column(ntokens, k);
                    863: 
                    864:   j = 10;
                    865:   for (i = ntokens + 1; i < nsyms; i++)
                    866:     {
                    867:       putc(',', ftable);
                    868: 
                    869:       if (j >= 10)
                    870:        {
                    871:          putc('\n', ftable);
                    872:          j = 1;
                    873:        }
                    874:       else
                    875:        {
                    876:          j++;
                    877:        }
                    878: 
                    879:       k = default_goto(i);
                    880:       fprintf(ftable, "%6d", k);
                    881:       save_column(i, k);
                    882:     }
                    883: 
                    884:   fprintf(ftable, "\n};\n");
                    885:   FREE(state_count);
                    886: }
                    887: 
                    888: 
                    889: 
                    890: int
                    891: default_goto(symbol)
                    892: int symbol;
                    893: {
                    894:   register int i;
                    895:   register int m;
                    896:   register int n;
                    897:   register int default_state;
                    898:   register int max;
                    899: 
                    900:   m = goto_map[symbol];
                    901:   n = goto_map[symbol + 1];
                    902: 
                    903:   if (m == n)
                    904:     return (-1);
                    905: 
                    906:   for (i = 0; i < nstates; i++)
                    907:     state_count[i] = 0;
                    908: 
                    909:   for (i = m; i < n; i++)
                    910:     state_count[to_state[i]]++;
                    911: 
                    912:   max = 0;
                    913:   default_state = -1;
                    914: 
                    915:   for (i = 0; i < nstates; i++)
                    916:     {
                    917:       if (state_count[i] > max)
                    918:        {
                    919:          max = state_count[i];
                    920:          default_state = i;
                    921:        }
                    922:     }
                    923: 
                    924:   return (default_state);
                    925: }
                    926: 
                    927: 
                    928: void
                    929: save_column(symbol, default_state)
                    930: int symbol;
                    931: int default_state;
                    932: {
                    933:   register int i;
                    934:   register int m;
                    935:   register int n;
                    936:   register short *sp;
                    937:   register short *sp1;
                    938:   register short *sp2;
                    939:   register int count;
                    940:   register int symno;
                    941: 
                    942:   m = goto_map[symbol];
                    943:   n = goto_map[symbol + 1];
                    944: 
                    945:   count = 0;
                    946:   for (i = m; i < n; i++)
                    947:     {
                    948:       if (to_state[i] != default_state)
                    949:        count++;
                    950:     }
                    951: 
                    952:   if (count == 0)
                    953:     return;
                    954: 
                    955:   symno = symbol - ntokens + nstates;
                    956: 
                    957:   froms[symno] = sp1 = sp = NEW2(count, short);
                    958:   tos[symno] = sp2 = NEW2(count, short);
                    959: 
                    960:   for (i = m; i < n; i++)
                    961:     {
                    962:       if (to_state[i] != default_state)
                    963:        {
                    964:          *sp1++ = from_state[i];
                    965:          *sp2++ = to_state[i];
                    966:        }
                    967:     }
                    968: 
                    969:   tally[symno] = count;
                    970:   width[symno] = sp1[-1] - sp[0] + 1;
                    971: }
                    972: 
                    973: 
                    974: 
                    975: /* the next few functions decide how to pack 
                    976:    the actions and gotos information into yytable. */
                    977: 
                    978: void
                    979: sort_actions()
                    980: {
                    981:   register int i;
                    982:   register int j;
                    983:   register int k;
                    984:   register int t;
                    985:   register int w;
                    986: 
                    987:   order = NEW2(nvectors, short);
                    988:   nentries = 0;
                    989: 
                    990:   for (i = 0; i < nvectors; i++)
                    991:     {
                    992:       if (tally[i] > 0)
                    993:        {
                    994:          t = tally[i];
                    995:          w = width[i];
                    996:          j = nentries - 1;
                    997: 
                    998:          while (j >= 0 && (width[order[j]] < w))
                    999:            j--;
                   1000: 
                   1001:          while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
                   1002:            j--;
                   1003: 
                   1004:          for (k = nentries - 1; k > j; k--)
                   1005:            order[k + 1] = order[k];
                   1006: 
                   1007:          order[j + 1] = i;
                   1008:          nentries++;
                   1009:        }
                   1010:     }
                   1011: }
                   1012: 
                   1013: 
                   1014: void
                   1015: pack_table()
                   1016: {
                   1017:   register int i;
                   1018:   register int place;
                   1019:   register int state;
                   1020: 
                   1021:   base = NEW2(nvectors, short);
                   1022:   pos = NEW2(nentries, short);
                   1023:   table = NEW2(MAXTABLE, short);
                   1024:   check = NEW2(MAXTABLE, short);
                   1025: 
                   1026:   lowzero = 0;
                   1027:   high = 0;
                   1028: 
                   1029:   for (i = 0; i < nvectors; i++)
                   1030:     base[i] = MINSHORT;
                   1031: 
                   1032:   for (i = 0; i < MAXTABLE; i++)
                   1033:     check[i] = -1;
                   1034: 
                   1035:   for (i = 0; i < nentries; i++)
                   1036:     {
                   1037:       state = matching_state(i);
                   1038: 
                   1039:       if (state < 0)
                   1040:        place = pack_vector(i);
                   1041:       else
                   1042:        place = base[state];
                   1043: 
                   1044:       pos[i] = place;
                   1045:       base[order[i]] = place;
                   1046:     }
                   1047: 
                   1048:   for (i = 0; i < nvectors; i++)
                   1049:     {
                   1050:       if (froms[i])
                   1051:        FREE(froms[i]);
                   1052:       if (tos[i])
                   1053:        FREE(tos[i]);
                   1054:     }
                   1055: 
                   1056:   FREE(froms);
                   1057:   FREE(tos);
                   1058:   FREE(pos);
                   1059: }
                   1060: 
                   1061: 
                   1062: 
                   1063: int
                   1064: matching_state(vector)
                   1065: int vector;
                   1066: {
                   1067:   register int i;
                   1068:   register int j;
                   1069:   register int k;
                   1070:   register int t;
                   1071:   register int w;
                   1072:   register int match;
                   1073:   register int prev;
                   1074: 
                   1075:   i = order[vector];
                   1076:   if (i >= nstates)
                   1077:     return (-1);
                   1078: 
                   1079:   t = tally[i];
                   1080:   w = width[i];
                   1081: 
                   1082:   for (prev = vector - 1; prev >= 0; prev--)
                   1083:     {
                   1084:       j = order[prev];
                   1085:       if (width[j] != w || tally[j] != t)
                   1086:        return (-1);
                   1087: 
                   1088:       match = 1;
                   1089:       for (k = 0; match && k < t; k++)
                   1090:        {
                   1091:          if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
                   1092:            match = 0;
                   1093:        }
                   1094: 
                   1095:       if (match)
                   1096:        return (j);
                   1097:     }
                   1098: 
                   1099:   return (-1);
                   1100: }
                   1101: 
                   1102: 
                   1103: 
                   1104: int
                   1105: pack_vector(vector)
                   1106: int vector;
                   1107: {
                   1108:   register int i;
                   1109:   register int j;
                   1110:   register int k;
                   1111:   register int t;
                   1112:   register int loc;
                   1113:   register int ok;
                   1114:   register short *from;
                   1115:   register short *to;
                   1116: 
                   1117:   i = order[vector];
                   1118:   t = tally[i];
                   1119: 
                   1120:   if (t == 0)
                   1121:     berror("pack_vector");
                   1122: 
                   1123:   from = froms[i];
                   1124:   to = tos[i];
                   1125: 
                   1126:   for (j = lowzero - from[0]; j < MAXTABLE; j++)
                   1127:     {
                   1128:       ok = 1;
                   1129: 
                   1130:       for (k = 0; ok && k < t; k++)
                   1131:        {
                   1132:          loc = j + from[k];
                   1133:          if (loc > MAXTABLE)
                   1134:            fatals("maximum table size (%d) exceeded",MAXTABLE);
                   1135: 
                   1136:          if (table[loc] != 0)
                   1137:            ok = 0;
                   1138:        }
                   1139: 
                   1140:       for (k = 0; ok && k < vector; k++)
                   1141:        {
                   1142:          if (pos[k] == j)
                   1143:            ok = 0;
                   1144:        }
                   1145: 
                   1146:       if (ok)
                   1147:        {
                   1148:          for (k = 0; k < t; k++)
                   1149:            {
                   1150:              loc = j + from[k];
                   1151:              table[loc] = to[k];
                   1152:              check[loc] = from[k];
                   1153:            }
                   1154: 
                   1155:          while (table[lowzero] != 0)
                   1156:            lowzero++;
                   1157: 
                   1158:          if (loc > high)
                   1159:            high = loc;
                   1160: 
                   1161:          return (j);
                   1162:        }
                   1163:     }
                   1164: 
                   1165:   berror("pack_vector");
                   1166:   return 0;    /* JF keep lint happy */
                   1167: }
                   1168: 
                   1169: 
                   1170: 
                   1171: /* the following functions output yytable, yycheck
                   1172:    and the vectors whose elements index the portion starts */
                   1173: 
                   1174: void
                   1175: output_base()
                   1176: {
                   1177:   register int i;
                   1178:   register int j;
                   1179: 
                   1180:   fprintf(ftable, "\nstatic const short yypact[] = {%6d", base[0]);
                   1181: 
                   1182:   j = 10;
                   1183:   for (i = 1; i < nstates; i++)
                   1184:     {
                   1185:       putc(',', ftable);
                   1186: 
                   1187:       if (j >= 10)
                   1188:        {
                   1189:          putc('\n', ftable);
                   1190:          j = 1;
                   1191:        }
                   1192:       else
                   1193:        {
                   1194:          j++;
                   1195:        }
                   1196: 
                   1197:       fprintf(ftable, "%6d", base[i]);
                   1198:     }
                   1199: 
                   1200:   fprintf(ftable, "\n};\n\nstatic const short yypgoto[] = {%6d", base[nstates]);
                   1201: 
                   1202:   j = 10;
                   1203:   for (i = nstates + 1; i < nvectors; i++)
                   1204:     {
                   1205:       putc(',', ftable);
                   1206: 
                   1207:       if (j >= 10)
                   1208:        {
                   1209:          putc('\n', ftable);
                   1210:          j = 1;
                   1211:        }
                   1212:       else
                   1213:        {
                   1214:          j++;
                   1215:        }
                   1216: 
                   1217:       fprintf(ftable, "%6d", base[i]);
                   1218:     }
                   1219: 
                   1220:   fprintf(ftable, "\n};\n");
                   1221:   FREE(base);
                   1222: }
                   1223: 
                   1224: 
                   1225: void
                   1226: output_table()
                   1227: {
                   1228:   register int i;
                   1229:   register int j;
                   1230: 
                   1231:   fprintf(ftable, "\n\n#define\tYYLAST\t\t%d\n\n", high);
                   1232:   fprintf(ftable, "\nstatic const short yytable[] = {%6d", table[0]);
                   1233: 
                   1234:   j = 10;
                   1235:   for (i = 1; i <= high; i++)
                   1236:     {
                   1237:       putc(',', ftable);
                   1238: 
                   1239:       if (j >= 10)
                   1240:        {
                   1241:          putc('\n', ftable);
                   1242:          j = 1;
                   1243:        }
                   1244:       else
                   1245:        {
                   1246:          j++;
                   1247:        }
                   1248: 
                   1249:       fprintf(ftable, "%6d", table[i]);
                   1250:     }
                   1251: 
                   1252:   fprintf(ftable, "\n};\n");
                   1253:   FREE(table);
                   1254: }
                   1255: 
                   1256: 
                   1257: void
                   1258: output_check()
                   1259: {
                   1260:   register int i;
                   1261:   register int j;
                   1262: 
                   1263:   fprintf(ftable, "\nstatic const short yycheck[] = {%6d", check[0]);
                   1264: 
                   1265:   j = 10;
                   1266:   for (i = 1; i <= high; i++)
                   1267:     {
                   1268:       putc(',', ftable);
                   1269: 
                   1270:       if (j >= 10)
                   1271:        {
                   1272:          putc('\n', ftable);
                   1273:          j = 1;
                   1274:        }
                   1275:       else
                   1276:        {
                   1277:          j++;
                   1278:        }
                   1279: 
                   1280:       fprintf(ftable, "%6d", check[i]);
                   1281:     }
                   1282: 
                   1283:   fprintf(ftable, "\n};\n");
                   1284:   FREE(check);
                   1285: }
                   1286: 
                   1287: 
                   1288: 
                   1289: /* copy the parser code into the ftable file at the end.  */
                   1290: 
                   1291: void
                   1292: output_parser()
                   1293: {
                   1294:   register int c;
                   1295: #ifdef DONTDEF
                   1296:   FILE *fpars;
                   1297: #else
                   1298: #define fpars fparser
                   1299: #endif
                   1300: 
                   1301:   if (pure_parser)
                   1302:     fprintf(ftable, "#define YYPURE 1\n\n");
                   1303: 
                   1304: #ifdef DONTDEF /* JF no longer needed 'cuz open_extra_files changes the
                   1305:                   currently open parser from bison.simple to bison.hairy */
                   1306:   if (semantic_parser)
                   1307:     fpars = fparser;
                   1308:   else fpars = fparser1;
                   1309: #endif
                   1310: 
                   1311:   /* Loop over lines in the standard parser file.  */
                   1312: 
                   1313:   while (1)
                   1314:     {
                   1315:       int write_line = 1;
                   1316: 
                   1317:       c = getc(fpars);
                   1318: 
                   1319:       /* See if the line starts with `#line.
                   1320:         If so, set write_line to 0.  */
                   1321:       if (nolinesflag)
                   1322:        if (c == '#') 
                   1323:          {
                   1324:            c = getc(fpars);
                   1325:            if (c == 'l')
                   1326:              {
                   1327:                c = getc(fpars);
                   1328:                if (c == 'i')
                   1329:                  {
                   1330:                    c = getc(fpars);
                   1331:                    if (c == 'n')
                   1332:                      {
                   1333:                        c = getc(fpars);
                   1334:                        if (c == 'e')
                   1335:                          write_line = 0;
                   1336:                        else
                   1337:                          fprintf(ftable, "#lin");
                   1338:                      }
                   1339:                    else
                   1340:                      fprintf(ftable, "#li");
                   1341:                  }
                   1342:                else
                   1343:                  fprintf(ftable, "#l");
                   1344:              }
                   1345:            else
                   1346:              fprintf(ftable, "#");
                   1347:          }
                   1348: 
                   1349:       /* now write out the line... */
                   1350:       for ( ; c != '\n' && c != EOF; c = getc(fpars))
                   1351:        if (write_line)
                   1352:          if (c == '$')
                   1353:            {
                   1354:              /* `$' in the parser file indicates where to put the actions.
                   1355:                 Copy them in at this point.  */
                   1356:              rewind(faction);
                   1357:              for(c=getc(faction);c!=EOF;c=getc(faction))
                   1358:                putc(c,ftable);
                   1359:            }
                   1360:          else
                   1361:            putc(c, ftable);
                   1362:       if (c == EOF)
                   1363:        break;
                   1364:       putc(c, ftable);
                   1365:     }
                   1366: }
                   1367: 
                   1368: 
                   1369: void
                   1370: output_program()
                   1371: {
                   1372:   register int c;
                   1373:   extern int lineno;
                   1374: 
                   1375:   if (!nolinesflag)
                   1376:     fprintf(ftable, "#line %d \"%s\"\n", lineno, infile);
                   1377: 
                   1378:   c = getc(finput);
                   1379:   while (c != EOF)
                   1380:     {
                   1381:       putc(c, ftable);
                   1382:       c = getc(finput);
                   1383:     }
                   1384: }
                   1385: 
                   1386: 
                   1387: void
                   1388: free_itemsets()
                   1389: {
                   1390:   register core *cp,*cptmp;
                   1391: 
                   1392:   FREE(state_table);
                   1393: 
                   1394:   for (cp = first_state; cp; cp = cptmp) {
                   1395:     cptmp=cp->next;
                   1396:     FREE(cp);
                   1397:   }
                   1398: }
                   1399: 
                   1400: 
                   1401: void
                   1402: free_shifts()
                   1403: {
                   1404:   register shifts *sp,*sptmp;/* JF derefrenced freed ptr */
                   1405: 
                   1406:   FREE(shift_table);
                   1407: 
                   1408:   for (sp = first_shift; sp; sp = sptmp) {
                   1409:     sptmp=sp->next;
                   1410:     FREE(sp);
                   1411:   }
                   1412: }
                   1413: 
                   1414: 
                   1415: void
                   1416: free_reductions()
                   1417: {
                   1418:   register reductions *rp,*rptmp;/* JF fixed freed ptr */
                   1419: 
                   1420:   FREE(reduction_table);
                   1421: 
                   1422:   for (rp = first_reduction; rp; rp = rptmp) {
                   1423:     rptmp=rp->next;
                   1424:     FREE(rp);
                   1425:   }
                   1426: }

unix.superglobalmegacorp.com

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