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