|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.