]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/byacc/output.c
Optionally bind ktls threads to NUMA domains
[FreeBSD/FreeBSD.git] / contrib / byacc / output.c
1 /* $Id: output.c,v 1.92 2019/11/20 00:55:05 tom Exp $ */
2
3 #include "defs.h"
4
5 #define StaticOrR       (rflag ? "" : "static ")
6 #define CountLine(fp)   (!rflag || ((fp) == code_file))
7
8 #if defined(YYBTYACC)
9 #define PER_STATE 3
10 #else
11 #define PER_STATE 2
12 #endif
13
14 static int nvectors;
15 static int nentries;
16 static Value_t **froms;
17 static Value_t **tos;
18 #if defined(YYBTYACC)
19 static Value_t *conflicts = NULL;
20 static Value_t nconflicts = 0;
21 #endif
22 static Value_t *tally;
23 static Value_t *width;
24 static Value_t *state_count;
25 static Value_t *order;
26 static Value_t *base;
27 static Value_t *pos;
28 static int maxtable;
29 static Value_t *table;
30 static Value_t *check;
31 static int lowzero;
32 static long high;
33
34 static void
35 putc_code(FILE * fp, int c)
36 {
37     if ((c == '\n') && (fp == code_file))
38         ++outline;
39     putc(c, fp);
40 }
41
42 static void
43 putl_code(FILE * fp, const char *s)
44 {
45     if (fp == code_file)
46         ++outline;
47     fputs(s, fp);
48 }
49
50 static void
51 puts_code(FILE * fp, const char *s)
52 {
53     fputs(s, fp);
54 }
55
56 static void
57 puts_param_types(FILE * fp, param *list, int more)
58 {
59     param *p;
60
61     if (list != 0)
62     {
63         for (p = list; p; p = p->next)
64         {
65             size_t len_type = strlen(p->type);
66             fprintf(fp, "%s%s%s%s%s", p->type,
67                     (((len_type != 0) && (p->type[len_type - 1] == '*'))
68                      ? ""
69                      : " "),
70                     p->name, p->type2,
71                     ((more || p->next) ? ", " : ""));
72         }
73     }
74     else
75     {
76         if (!more)
77             fprintf(fp, "void");
78     }
79 }
80
81 static void
82 puts_param_names(FILE * fp, param *list, int more)
83 {
84     param *p;
85
86     for (p = list; p; p = p->next)
87     {
88         fprintf(fp, "%s%s", p->name,
89                 ((more || p->next) ? ", " : ""));
90     }
91 }
92
93 static void
94 write_code_lineno(FILE * fp)
95 {
96     if (!lflag && (fp == code_file))
97     {
98         ++outline;
99         fprintf(fp, line_format, outline + 1, code_file_name);
100     }
101 }
102
103 static void
104 write_input_lineno(void)
105 {
106     if (!lflag)
107     {
108         ++outline;
109         fprintf(code_file, line_format, lineno, input_file_name);
110     }
111 }
112
113 static void
114 define_prefixed(FILE * fp, const char *name)
115 {
116     int bump_line = CountLine(fp);
117     if (bump_line)
118         ++outline;
119     fprintf(fp, "\n");
120
121     if (bump_line)
122         ++outline;
123     fprintf(fp, "#ifndef %s\n", name);
124
125     if (bump_line)
126         ++outline;
127     fprintf(fp, "#define %-10s %s%s\n", name, symbol_prefix, name + 2);
128
129     if (bump_line)
130         ++outline;
131     fprintf(fp, "#endif /* %s */\n", name);
132 }
133
134 static void
135 output_prefix(FILE * fp)
136 {
137     if (symbol_prefix == NULL)
138     {
139         symbol_prefix = "yy";
140     }
141     else
142     {
143         define_prefixed(fp, "yyparse");
144         define_prefixed(fp, "yylex");
145         define_prefixed(fp, "yyerror");
146         define_prefixed(fp, "yychar");
147         define_prefixed(fp, "yyval");
148         define_prefixed(fp, "yylval");
149         define_prefixed(fp, "yydebug");
150         define_prefixed(fp, "yynerrs");
151         define_prefixed(fp, "yyerrflag");
152         define_prefixed(fp, "yylhs");
153         define_prefixed(fp, "yylen");
154         define_prefixed(fp, "yydefred");
155 #if defined(YYBTYACC)
156         define_prefixed(fp, "yystos");
157 #endif
158         define_prefixed(fp, "yydgoto");
159         define_prefixed(fp, "yysindex");
160         define_prefixed(fp, "yyrindex");
161         define_prefixed(fp, "yygindex");
162         define_prefixed(fp, "yytable");
163         define_prefixed(fp, "yycheck");
164         define_prefixed(fp, "yyname");
165         define_prefixed(fp, "yyrule");
166 #if defined(YYBTYACC)
167         if (locations)
168         {
169             define_prefixed(fp, "yyloc");
170             define_prefixed(fp, "yylloc");
171         }
172         putc_code(fp, '\n');
173         putl_code(fp, "#if YYBTYACC\n");
174
175         define_prefixed(fp, "yycindex");
176         define_prefixed(fp, "yyctable");
177
178         putc_code(fp, '\n');
179         putl_code(fp, "#endif /* YYBTYACC */\n");
180         putc_code(fp, '\n');
181 #endif
182     }
183     if (CountLine(fp))
184         ++outline;
185     fprintf(fp, "#define YYPREFIX \"%s\"\n", symbol_prefix);
186 }
187
188 static void
189 output_code_lines(FILE * fp, int cl)
190 {
191     if (code_lines[cl].lines != NULL)
192     {
193         if (fp == code_file)
194         {
195             outline += (int)code_lines[cl].num;
196             outline += 3;
197             fprintf(fp, "\n");
198         }
199         fprintf(fp, "/* %%code \"%s\" block start */\n", code_lines[cl].name);
200         fputs(code_lines[cl].lines, fp);
201         fprintf(fp, "/* %%code \"%s\" block end */\n", code_lines[cl].name);
202         if (fp == code_file)
203         {
204             write_code_lineno(fp);
205         }
206     }
207 }
208
209 static void
210 output_newline(void)
211 {
212     if (!rflag)
213         ++outline;
214     putc('\n', output_file);
215 }
216
217 static void
218 output_line(const char *value)
219 {
220     fputs(value, output_file);
221     output_newline();
222 }
223
224 static void
225 output_int(int value)
226 {
227     fprintf(output_file, "%5d,", value);
228 }
229
230 static void
231 start_int_table(const char *name, int value)
232 {
233     int need = 34 - (int)(strlen(symbol_prefix) + strlen(name));
234
235     if (need < 6)
236         need = 6;
237     fprintf(output_file,
238             "%sconst YYINT %s%s[] = {%*d,",
239             StaticOrR, symbol_prefix, name, need, value);
240 }
241
242 static void
243 start_str_table(const char *name)
244 {
245     fprintf(output_file,
246             "%sconst char *const %s%s[] = {",
247             StaticOrR, symbol_prefix, name);
248     output_newline();
249 }
250
251 static void
252 end_table(void)
253 {
254     output_newline();
255     output_line("};");
256 }
257
258 static void
259 output_stype(FILE * fp)
260 {
261     if (!unionized && ntags == 0)
262     {
263         putc_code(fp, '\n');
264         putl_code(fp, "#if "
265                   "! defined(YYSTYPE) && "
266                   "! defined(YYSTYPE_IS_DECLARED)\n");
267         putl_code(fp, "/* Default: YYSTYPE is the semantic value type. */\n");
268         putl_code(fp, "typedef int YYSTYPE;\n");
269         putl_code(fp, "# define YYSTYPE_IS_DECLARED 1\n");
270         putl_code(fp, "#endif\n");
271     }
272 }
273
274 #if defined(YYBTYACC)
275 static void
276 output_ltype(FILE * fp)
277 {
278     putc_code(fp, '\n');
279     putl_code(fp, "#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED\n");
280     putl_code(fp, "/* Default: YYLTYPE is the text position type. */\n");
281     putl_code(fp, "typedef struct YYLTYPE\n");
282     putl_code(fp, "{\n");
283     putl_code(fp, "    int first_line;\n");
284     putl_code(fp, "    int first_column;\n");
285     putl_code(fp, "    int last_line;\n");
286     putl_code(fp, "    int last_column;\n");
287     putl_code(fp, "    unsigned source;\n");
288     putl_code(fp, "} YYLTYPE;\n");
289     putl_code(fp, "#define YYLTYPE_IS_DECLARED 1\n");
290     putl_code(fp, "#endif\n");
291     putl_code(fp, "#define YYRHSLOC(rhs, k) ((rhs)[k])\n");
292 }
293 #endif
294
295 static void
296 output_YYINT_typedef(FILE * fp)
297 {
298     /* generate the type used to index the various parser tables */
299     if (CountLine(fp))
300         ++outline;
301     fprintf(fp, "typedef %s YYINT;\n", CONCAT1("", YYINT));
302 }
303
304 static void
305 output_rule_data(void)
306 {
307     int i;
308     int j;
309
310     output_YYINT_typedef(output_file);
311
312     start_int_table("lhs", symbol_value[start_symbol]);
313
314     j = 10;
315     for (i = 3; i < nrules; i++)
316     {
317         if (j >= 10)
318         {
319             output_newline();
320             j = 1;
321         }
322         else
323             ++j;
324
325         output_int(symbol_value[rlhs[i]]);
326     }
327     end_table();
328
329     start_int_table("len", 2);
330
331     j = 10;
332     for (i = 3; i < nrules; i++)
333     {
334         if (j >= 10)
335         {
336             output_newline();
337             j = 1;
338         }
339         else
340             j++;
341
342         output_int(rrhs[i + 1] - rrhs[i] - 1);
343     }
344     end_table();
345 }
346
347 static void
348 output_yydefred(void)
349 {
350     int i, j;
351
352     start_int_table("defred", (defred[0] ? defred[0] - 2 : 0));
353
354     j = 10;
355     for (i = 1; i < nstates; i++)
356     {
357         if (j < 10)
358             ++j;
359         else
360         {
361             output_newline();
362             j = 1;
363         }
364
365         output_int((defred[i] ? defred[i] - 2 : 0));
366     }
367
368     end_table();
369 }
370
371 #if defined(YYBTYACC)
372 static void
373 output_accessing_symbols(void)
374 {
375     int i, j;
376     int *translate;
377
378     if (nstates != 0)
379     {
380         translate = TMALLOC(int, nstates);
381         NO_SPACE(translate);
382
383         for (i = 0; i < nstates; ++i)
384         {
385             int gsymb = accessing_symbol[i];
386
387             translate[i] = symbol_pval[gsymb];
388         }
389
390         putl_code(output_file,
391                   "#if defined(YYDESTRUCT_CALL) || defined(YYSTYPE_TOSTRING)\n");
392         /* yystos[] may be unused, depending on compile-time defines */
393         start_int_table("stos", translate[0]);
394
395         j = 10;
396         for (i = 1; i < nstates; ++i)
397         {
398             if (j < 10)
399                 ++j;
400             else
401             {
402                 output_newline();
403                 j = 1;
404             }
405
406             output_int(translate[i]);
407         }
408
409         end_table();
410         FREE(translate);
411         putl_code(output_file,
412                   "#endif /* YYDESTRUCT_CALL || YYSTYPE_TOSTRING */\n");
413     }
414 }
415
416 static Value_t
417 find_conflict_base(int cbase)
418 {
419     int i, j;
420
421     for (i = 0; i < cbase; i++)
422     {
423         for (j = 0; j + cbase < nconflicts; j++)
424         {
425             if (conflicts[i + j] != conflicts[cbase + j])
426                 break;
427         }
428         if (j + cbase >= nconflicts)
429             break;
430     }
431     return (Value_t)i;
432 }
433 #endif
434
435 static void
436 token_actions(void)
437 {
438     int i, j;
439     Value_t shiftcount, reducecount;
440 #if defined(YYBTYACC)
441     Value_t conflictcount = 0;
442     Value_t csym = -1;
443     Value_t cbase = 0;
444 #endif
445     int max, min;
446     Value_t *actionrow, *r, *s;
447     action *p;
448
449     actionrow = NEW2(PER_STATE * ntokens, Value_t);
450     for (i = 0; i < nstates; ++i)
451     {
452         if (parser[i])
453         {
454             for (j = 0; j < PER_STATE * ntokens; ++j)
455                 actionrow[j] = 0;
456
457             shiftcount = 0;
458             reducecount = 0;
459 #if defined(YYBTYACC)
460             if (backtrack)
461             {
462                 conflictcount = 0;
463                 csym = -1;
464                 cbase = nconflicts;
465             }
466 #endif
467             for (p = parser[i]; p; p = p->next)
468             {
469 #if defined(YYBTYACC)
470                 if (backtrack)
471                 {
472                     if (csym != -1 && csym != p->symbol)
473                     {
474                         conflictcount++;
475                         conflicts[nconflicts++] = -1;
476                         j = find_conflict_base(cbase);
477                         actionrow[csym + 2 * ntokens] = (Value_t)(j + 1);
478                         if (j == cbase)
479                         {
480                             cbase = nconflicts;
481                         }
482                         else
483                         {
484                             if (conflicts[cbase] == -1)
485                                 cbase++;
486                             nconflicts = cbase;
487                         }
488                         csym = -1;
489                     }
490                 }
491 #endif
492                 if (p->suppressed == 0)
493                 {
494                     if (p->action_code == SHIFT)
495                     {
496                         ++shiftcount;
497                         actionrow[p->symbol] = p->number;
498                     }
499                     else if (p->action_code == REDUCE && p->number != defred[i])
500                     {
501                         ++reducecount;
502                         actionrow[p->symbol + ntokens] = p->number;
503                     }
504                 }
505 #if defined(YYBTYACC)
506                 else if (backtrack && p->suppressed == 1)
507                 {
508                     csym = p->symbol;
509                     if (p->action_code == SHIFT)
510                     {
511                         conflicts[nconflicts++] = p->number;
512                     }
513                     else if (p->action_code == REDUCE && p->number != defred[i])
514                     {
515                         if (cbase == nconflicts)
516                         {
517                             if (cbase)
518                                 cbase--;
519                             else
520                                 conflicts[nconflicts++] = -1;
521                         }
522                         conflicts[nconflicts++] = (Value_t)(p->number - 2);
523                     }
524                 }
525 #endif
526             }
527 #if defined(YYBTYACC)
528             if (backtrack && csym != -1)
529             {
530                 conflictcount++;
531                 conflicts[nconflicts++] = -1;
532                 j = find_conflict_base(cbase);
533                 actionrow[csym + 2 * ntokens] = (Value_t)(j + 1);
534                 if (j == cbase)
535                 {
536                     cbase = nconflicts;
537                 }
538                 else
539                 {
540                     if (conflicts[cbase] == -1)
541                         cbase++;
542                     nconflicts = cbase;
543                 }
544             }
545 #endif
546
547             tally[i] = shiftcount;
548             tally[nstates + i] = reducecount;
549 #if defined(YYBTYACC)
550             if (backtrack)
551                 tally[2 * nstates + i] = conflictcount;
552 #endif
553             width[i] = 0;
554             width[nstates + i] = 0;
555 #if defined(YYBTYACC)
556             if (backtrack)
557                 width[2 * nstates + i] = 0;
558 #endif
559             if (shiftcount > 0)
560             {
561                 froms[i] = r = NEW2(shiftcount, Value_t);
562                 tos[i] = s = NEW2(shiftcount, Value_t);
563                 min = MAXYYINT;
564                 max = 0;
565                 for (j = 0; j < ntokens; ++j)
566                 {
567                     if (actionrow[j])
568                     {
569                         if (min > symbol_value[j])
570                             min = symbol_value[j];
571                         if (max < symbol_value[j])
572                             max = symbol_value[j];
573                         *r++ = symbol_value[j];
574                         *s++ = actionrow[j];
575                     }
576                 }
577                 width[i] = (Value_t)(max - min + 1);
578             }
579             if (reducecount > 0)
580             {
581                 froms[nstates + i] = r = NEW2(reducecount, Value_t);
582                 tos[nstates + i] = s = NEW2(reducecount, Value_t);
583                 min = MAXYYINT;
584                 max = 0;
585                 for (j = 0; j < ntokens; ++j)
586                 {
587                     if (actionrow[ntokens + j])
588                     {
589                         if (min > symbol_value[j])
590                             min = symbol_value[j];
591                         if (max < symbol_value[j])
592                             max = symbol_value[j];
593                         *r++ = symbol_value[j];
594                         *s++ = (Value_t)(actionrow[ntokens + j] - 2);
595                     }
596                 }
597                 width[nstates + i] = (Value_t)(max - min + 1);
598             }
599 #if defined(YYBTYACC)
600             if (backtrack && conflictcount > 0)
601             {
602                 froms[2 * nstates + i] = r = NEW2(conflictcount, Value_t);
603                 tos[2 * nstates + i] = s = NEW2(conflictcount, Value_t);
604                 min = MAXYYINT;
605                 max = 0;
606                 for (j = 0; j < ntokens; ++j)
607                 {
608                     if (actionrow[2 * ntokens + j])
609                     {
610                         if (min > symbol_value[j])
611                             min = symbol_value[j];
612                         if (max < symbol_value[j])
613                             max = symbol_value[j];
614                         *r++ = symbol_value[j];
615                         *s++ = (Value_t)(actionrow[2 * ntokens + j] - 1);
616                     }
617                 }
618                 width[2 * nstates + i] = (Value_t)(max - min + 1);
619             }
620 #endif
621         }
622     }
623     FREE(actionrow);
624 }
625
626 static int
627 default_goto(int symbol)
628 {
629     int i;
630     int m;
631     int n;
632     int default_state;
633     int max;
634
635     m = goto_map[symbol];
636     n = goto_map[symbol + 1];
637
638     if (m == n)
639         return (0);
640
641     for (i = 0; i < nstates; i++)
642         state_count[i] = 0;
643
644     for (i = m; i < n; i++)
645         state_count[to_state[i]]++;
646
647     max = 0;
648     default_state = 0;
649     for (i = 0; i < nstates; i++)
650     {
651         if (state_count[i] > max)
652         {
653             max = state_count[i];
654             default_state = i;
655         }
656     }
657
658     return (default_state);
659 }
660
661 static void
662 save_column(int symbol, int default_state)
663 {
664     int i;
665     int m;
666     int n;
667     Value_t *sp;
668     Value_t *sp1;
669     Value_t *sp2;
670     Value_t count;
671     int symno;
672
673     m = goto_map[symbol];
674     n = goto_map[symbol + 1];
675
676     count = 0;
677     for (i = m; i < n; i++)
678     {
679         if (to_state[i] != default_state)
680             ++count;
681     }
682     if (count == 0)
683         return;
684
685     symno = symbol_value[symbol] + PER_STATE * nstates;
686
687     froms[symno] = sp1 = sp = NEW2(count, Value_t);
688     tos[symno] = sp2 = NEW2(count, Value_t);
689
690     for (i = m; i < n; i++)
691     {
692         if (to_state[i] != default_state)
693         {
694             *sp1++ = from_state[i];
695             *sp2++ = to_state[i];
696         }
697     }
698
699     tally[symno] = count;
700     width[symno] = (Value_t)(sp1[-1] - sp[0] + 1);
701 }
702
703 static void
704 goto_actions(void)
705 {
706     int i, j, k;
707
708     state_count = NEW2(nstates, Value_t);
709
710     k = default_goto(start_symbol + 1);
711     start_int_table("dgoto", k);
712     save_column(start_symbol + 1, k);
713
714     j = 10;
715     for (i = start_symbol + 2; i < nsyms; i++)
716     {
717         if (j >= 10)
718         {
719             output_newline();
720             j = 1;
721         }
722         else
723             ++j;
724
725         k = default_goto(i);
726         output_int(k);
727         save_column(i, k);
728     }
729
730     end_table();
731     FREE(state_count);
732 }
733
734 static void
735 sort_actions(void)
736 {
737     Value_t i;
738     int j;
739     int k;
740     int t;
741     int w;
742
743     order = NEW2(nvectors, Value_t);
744     nentries = 0;
745
746     for (i = 0; i < nvectors; i++)
747     {
748         if (tally[i] > 0)
749         {
750             t = tally[i];
751             w = width[i];
752             j = nentries - 1;
753
754             while (j >= 0 && (width[order[j]] < w))
755                 j--;
756
757             while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
758                 j--;
759
760             for (k = nentries - 1; k > j; k--)
761                 order[k + 1] = order[k];
762
763             order[j + 1] = i;
764             nentries++;
765         }
766     }
767 }
768
769 /*  The function matching_vector determines if the vector specified by  */
770 /*  the input parameter matches a previously considered vector.  The    */
771 /*  test at the start of the function checks if the vector represents   */
772 /*  a row of shifts over terminal symbols or a row of reductions, or a  */
773 /*  column of shifts over a nonterminal symbol.  Berkeley Yacc does not */
774 /*  check if a column of shifts over a nonterminal symbols matches a    */
775 /*  previously considered vector.  Because of the nature of LR parsing  */
776 /*  tables, no two columns can match.  Therefore, the only possible     */
777 /*  match would be between a row and a column.  Such matches are        */
778 /*  unlikely.  Therefore, to save time, no attempt is made to see if a  */
779 /*  column matches a previously considered vector.                      */
780 /*                                                                      */
781 /*  Matching_vector is poorly designed.  The test could easily be made  */
782 /*  faster.  Also, it depends on the vectors being in a specific        */
783 /*  order.                                                              */
784 #if defined(YYBTYACC)
785 /*                                                                      */
786 /*  Not really any point in checking for matching conflicts -- it is    */
787 /*  extremely unlikely to occur, and conflicts are (hopefully) rare.    */
788 #endif
789
790 static int
791 matching_vector(int vector)
792 {
793     int i;
794     int j;
795     int k;
796     int t;
797     int w;
798     int match;
799     int prev;
800
801     i = order[vector];
802     if (i >= 2 * nstates)
803         return (-1);
804
805     t = tally[i];
806     w = width[i];
807
808     for (prev = vector - 1; prev >= 0; prev--)
809     {
810         j = order[prev];
811         if (width[j] != w || tally[j] != t)
812             return (-1);
813
814         match = 1;
815         for (k = 0; match && k < t; k++)
816         {
817             if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
818                 match = 0;
819         }
820
821         if (match)
822             return (j);
823     }
824
825     return (-1);
826 }
827
828 static int
829 pack_vector(int vector)
830 {
831     int i, j, k, l;
832     int t;
833     int loc;
834     int ok;
835     Value_t *from;
836     Value_t *to;
837     int newmax;
838
839     i = order[vector];
840     t = tally[i];
841     assert(t);
842
843     from = froms[i];
844     to = tos[i];
845
846     j = lowzero - from[0];
847     for (k = 1; k < t; ++k)
848         if (lowzero - from[k] > j)
849             j = lowzero - from[k];
850     for (;; ++j)
851     {
852         if (j == 0)
853             continue;
854         ok = 1;
855         for (k = 0; ok && k < t; k++)
856         {
857             loc = j + from[k];
858             if (loc >= maxtable - 1)
859             {
860                 if (loc >= MAXTABLE - 1)
861                     fatal("maximum table size exceeded");
862
863                 newmax = maxtable;
864                 do
865                 {
866                     newmax += 200;
867                 }
868                 while (newmax <= loc);
869
870                 table = TREALLOC(Value_t, table, newmax);
871                 NO_SPACE(table);
872
873                 check = TREALLOC(Value_t, check, newmax);
874                 NO_SPACE(check);
875
876                 for (l = maxtable; l < newmax; ++l)
877                 {
878                     table[l] = 0;
879                     check[l] = -1;
880                 }
881                 maxtable = newmax;
882             }
883
884             if (check[loc] != -1)
885                 ok = 0;
886         }
887         for (k = 0; ok && k < vector; k++)
888         {
889             if (pos[k] == j)
890                 ok = 0;
891         }
892         if (ok)
893         {
894             for (k = 0; k < t; k++)
895             {
896                 loc = j + from[k];
897                 table[loc] = to[k];
898                 check[loc] = from[k];
899                 if (loc > high)
900                     high = loc;
901             }
902
903             while (check[lowzero] != -1)
904                 ++lowzero;
905
906             return (j);
907         }
908     }
909 }
910
911 static void
912 pack_table(void)
913 {
914     int i;
915     Value_t place;
916     int state;
917
918     base = NEW2(nvectors, Value_t);
919     pos = NEW2(nentries, Value_t);
920
921     maxtable = 1000;
922     table = NEW2(maxtable, Value_t);
923     check = NEW2(maxtable, Value_t);
924
925     lowzero = 0;
926     high = 0;
927
928     for (i = 0; i < maxtable; i++)
929         check[i] = -1;
930
931     for (i = 0; i < nentries; i++)
932     {
933         state = matching_vector(i);
934
935         if (state < 0)
936             place = (Value_t)pack_vector(i);
937         else
938             place = base[state];
939
940         pos[i] = place;
941         base[order[i]] = place;
942     }
943
944     for (i = 0; i < nvectors; i++)
945     {
946         if (froms[i])
947             FREE(froms[i]);
948         if (tos[i])
949             FREE(tos[i]);
950     }
951
952     DO_FREE(froms);
953     DO_FREE(tos);
954     DO_FREE(tally);
955     DO_FREE(width);
956     DO_FREE(pos);
957 }
958
959 static void
960 output_base(void)
961 {
962     int i, j;
963
964     start_int_table("sindex", base[0]);
965
966     j = 10;
967     for (i = 1; i < nstates; i++)
968     {
969         if (j >= 10)
970         {
971             output_newline();
972             j = 1;
973         }
974         else
975             ++j;
976
977         output_int(base[i]);
978     }
979
980     end_table();
981
982     start_int_table("rindex", base[nstates]);
983
984     j = 10;
985     for (i = nstates + 1; i < 2 * nstates; i++)
986     {
987         if (j >= 10)
988         {
989             output_newline();
990             j = 1;
991         }
992         else
993             ++j;
994
995         output_int(base[i]);
996     }
997
998     end_table();
999
1000 #if defined(YYBTYACC)
1001     output_line("#if YYBTYACC");
1002     start_int_table("cindex", base[2 * nstates]);
1003
1004     j = 10;
1005     for (i = 2 * nstates + 1; i < 3 * nstates; i++)
1006     {
1007         if (j >= 10)
1008         {
1009             output_newline();
1010             j = 1;
1011         }
1012         else
1013             ++j;
1014
1015         output_int(base[i]);
1016     }
1017
1018     end_table();
1019     output_line("#endif");
1020 #endif
1021
1022     start_int_table("gindex", base[PER_STATE * nstates]);
1023
1024     j = 10;
1025     for (i = PER_STATE * nstates + 1; i < nvectors - 1; i++)
1026     {
1027         if (j >= 10)
1028         {
1029             output_newline();
1030             j = 1;
1031         }
1032         else
1033             ++j;
1034
1035         output_int(base[i]);
1036     }
1037
1038     end_table();
1039     FREE(base);
1040 }
1041
1042 static void
1043 output_table(void)
1044 {
1045     int i;
1046     int j;
1047
1048     if (high >= MAXYYINT)
1049     {
1050         fprintf(stderr, "YYTABLESIZE: %ld\n", high);
1051         fprintf(stderr, "Table is longer than %d elements.\n", MAXYYINT);
1052         done(1);
1053     }
1054
1055     ++outline;
1056     fprintf(code_file, "#define YYTABLESIZE %ld\n", high);
1057     start_int_table("table", table[0]);
1058
1059     j = 10;
1060     for (i = 1; i <= high; i++)
1061     {
1062         if (j >= 10)
1063         {
1064             output_newline();
1065             j = 1;
1066         }
1067         else
1068             ++j;
1069
1070         output_int(table[i]);
1071     }
1072
1073     end_table();
1074     FREE(table);
1075 }
1076
1077 static void
1078 output_check(void)
1079 {
1080     int i;
1081     int j;
1082
1083     start_int_table("check", check[0]);
1084
1085     j = 10;
1086     for (i = 1; i <= high; i++)
1087     {
1088         if (j >= 10)
1089         {
1090             output_newline();
1091             j = 1;
1092         }
1093         else
1094             ++j;
1095
1096         output_int(check[i]);
1097     }
1098
1099     end_table();
1100     FREE(check);
1101 }
1102
1103 #if defined(YYBTYACC)
1104 static void
1105 output_ctable(void)
1106 {
1107     int i;
1108     int j;
1109     int limit = (conflicts != 0) ? nconflicts : 0;
1110
1111     if (limit < high)
1112         limit = (int)high;
1113
1114     output_line("#if YYBTYACC");
1115     start_int_table("ctable", conflicts ? conflicts[0] : -1);
1116
1117     j = 10;
1118     for (i = 1; i < limit; i++)
1119     {
1120         if (j >= 10)
1121         {
1122             output_newline();
1123             j = 1;
1124         }
1125         else
1126             ++j;
1127
1128         output_int((conflicts != 0 && i < nconflicts) ? conflicts[i] : -1);
1129     }
1130
1131     if (conflicts)
1132         FREE(conflicts);
1133
1134     end_table();
1135     output_line("#endif");
1136 }
1137 #endif
1138
1139 static void
1140 output_actions(void)
1141 {
1142     nvectors = PER_STATE * nstates + nvars;
1143
1144     froms = NEW2(nvectors, Value_t *);
1145     tos = NEW2(nvectors, Value_t *);
1146     tally = NEW2(nvectors, Value_t);
1147     width = NEW2(nvectors, Value_t);
1148
1149 #if defined(YYBTYACC)
1150     if (backtrack && (SRtotal + RRtotal) != 0)
1151         conflicts = NEW2(4 * (SRtotal + RRtotal), Value_t);
1152 #endif
1153
1154     token_actions();
1155     FREE(lookaheads);
1156     FREE(LA);
1157     FREE(LAruleno);
1158     FREE(accessing_symbol);
1159
1160     goto_actions();
1161     FREE(goto_base);
1162     FREE(from_state);
1163     FREE(to_state);
1164
1165     sort_actions();
1166     pack_table();
1167     output_base();
1168     output_table();
1169     output_check();
1170 #if defined(YYBTYACC)
1171     output_ctable();
1172 #endif
1173 }
1174
1175 static int
1176 is_C_identifier(char *name)
1177 {
1178     char *s;
1179     int c;
1180
1181     s = name;
1182     c = *s;
1183     if (c == '"')
1184     {
1185         c = *++s;
1186         if (!IS_NAME1(c))
1187             return (0);
1188         while ((c = *++s) != '"')
1189         {
1190             if (!IS_NAME2(c))
1191                 return (0);
1192         }
1193         return (1);
1194     }
1195
1196     if (!IS_NAME1(c))
1197         return (0);
1198     while ((c = *++s) != 0)
1199     {
1200         if (!IS_NAME2(c))
1201             return (0);
1202     }
1203     return (1);
1204 }
1205
1206 #if USE_HEADER_GUARDS
1207 static void
1208 start_defines_file(void)
1209 {
1210     fprintf(defines_file, "#ifndef _%s_defines_h_\n", symbol_prefix);
1211     fprintf(defines_file, "#define _%s_defines_h_\n\n", symbol_prefix);
1212 }
1213
1214 static void
1215 end_defines_file(void)
1216 {
1217     fprintf(defines_file, "\n#endif /* _%s_defines_h_ */\n", symbol_prefix);
1218 }
1219 #else
1220 #define start_defines_file()    /* nothing */
1221 #define end_defines_file()      /* nothing */
1222 #endif
1223
1224 static void
1225 output_defines(FILE * fp)
1226 {
1227     int c, i;
1228     char *s;
1229
1230     if (fp == defines_file)
1231     {
1232         output_code_lines(fp, CODE_REQUIRES);
1233     }
1234
1235     for (i = 2; i < ntokens; ++i)
1236     {
1237         s = symbol_name[i];
1238         if (is_C_identifier(s) && (!sflag || *s != '"'))
1239         {
1240             fprintf(fp, "#define ");
1241             c = *s;
1242             if (c == '"')
1243             {
1244                 while ((c = *++s) != '"')
1245                 {
1246                     putc(c, fp);
1247                 }
1248             }
1249             else
1250             {
1251                 do
1252                 {
1253                     putc(c, fp);
1254                 }
1255                 while ((c = *++s) != 0);
1256             }
1257             if (fp == code_file)
1258                 ++outline;
1259             fprintf(fp, " %d\n", symbol_value[i]);
1260         }
1261     }
1262
1263     if (fp == code_file)
1264         ++outline;
1265     if (fp != defines_file || iflag)
1266         fprintf(fp, "#define YYERRCODE %d\n", symbol_value[1]);
1267
1268     if (fp == defines_file)
1269     {
1270         output_code_lines(fp, CODE_PROVIDES);
1271     }
1272
1273     if (token_table && rflag && fp != externs_file)
1274     {
1275         if (fp == code_file)
1276             ++outline;
1277         fputs("#undef yytname\n", fp);
1278         if (fp == code_file)
1279             ++outline;
1280         fputs("#define yytname yyname\n", fp);
1281     }
1282
1283     if (fp == defines_file || (iflag && !dflag))
1284     {
1285         if (unionized)
1286         {
1287             if (union_file != 0)
1288             {
1289                 rewind(union_file);
1290                 while ((c = getc(union_file)) != EOF)
1291                     putc_code(fp, c);
1292             }
1293             if (!pure_parser)
1294                 fprintf(fp, "extern YYSTYPE %slval;\n", symbol_prefix);
1295         }
1296 #if defined(YYBTYACC)
1297         if (locations)
1298         {
1299             output_ltype(fp);
1300             fprintf(fp, "extern YYLTYPE %slloc;\n", symbol_prefix);
1301         }
1302 #endif
1303     }
1304 }
1305
1306 static void
1307 output_stored_text(FILE * fp)
1308 {
1309     int c;
1310     FILE *in;
1311
1312     if (text_file == NULL)
1313         open_error("text_file");
1314     rewind(text_file);
1315     in = text_file;
1316     if ((c = getc(in)) == EOF)
1317         return;
1318     putc_code(fp, c);
1319     while ((c = getc(in)) != EOF)
1320     {
1321         putc_code(fp, c);
1322     }
1323     write_code_lineno(fp);
1324 }
1325
1326 static int
1327 output_yydebug(FILE * fp)
1328 {
1329     fprintf(fp, "#ifndef YYDEBUG\n");
1330     fprintf(fp, "#define YYDEBUG %d\n", tflag);
1331     fprintf(fp, "#endif\n");
1332     return 3;
1333 }
1334
1335 static void
1336 output_debug(void)
1337 {
1338     int i, j, k, max, maxtok;
1339     const char **symnam;
1340     const char *s;
1341
1342     ++outline;
1343     fprintf(code_file, "#define YYFINAL %d\n", final_state);
1344
1345     outline += output_yydebug(code_file);
1346
1347     if (rflag)
1348     {
1349         output_yydebug(output_file);
1350     }
1351
1352     maxtok = 0;
1353     for (i = 0; i < ntokens; ++i)
1354         if (symbol_value[i] > maxtok)
1355             maxtok = symbol_value[i];
1356
1357     /* symbol_value[$accept] = -1         */
1358     /* symbol_value[<goal>]  = 0          */
1359     /* remaining non-terminals start at 1 */
1360     max = maxtok;
1361     for (i = ntokens; i < nsyms; ++i)
1362         if (((maxtok + 1) + (symbol_value[i] + 1)) > max)
1363             max = (maxtok + 1) + (symbol_value[i] + 1);
1364
1365     ++outline;
1366     fprintf(code_file, "#define YYMAXTOKEN %d\n", maxtok);
1367
1368     ++outline;
1369     fprintf(code_file, "#define YYUNDFTOKEN %d\n", max + 1);
1370
1371     ++outline;
1372     fprintf(code_file, "#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? "
1373             "YYUNDFTOKEN : (a))\n");
1374
1375     symnam = TMALLOC(const char *, max + 2);
1376     NO_SPACE(symnam);
1377
1378     /* Note that it is not necessary to initialize the element          */
1379     /* symnam[max].                                                     */
1380 #if defined(YYBTYACC)
1381     for (i = 0; i < max; ++i)
1382         symnam[i] = 0;
1383     for (i = nsyms - 1; i >= 0; --i)
1384         symnam[symbol_pval[i]] = symbol_name[i];
1385     symnam[max + 1] = "illegal-symbol";
1386 #else
1387     for (i = 0; i <= max; ++i)
1388         symnam[i] = 0;
1389     for (i = ntokens - 1; i >= 2; --i)
1390         symnam[symbol_value[i]] = symbol_name[i];
1391     symnam[0] = "end-of-file";
1392     symnam[max + 1] = "illegal-symbol";
1393 #endif
1394
1395     /*
1396      * bison's yytname[] array is roughly the same as byacc's yyname[] array.
1397      * The difference is that byacc does not predefine "$undefined".
1398      *
1399      * If the grammar declares "%token-table", define symbol "yytname" so
1400      * an application such as ntpd can build.
1401      */
1402     if (token_table)
1403     {
1404         if (!rflag)
1405         {
1406             output_line("#undef yytname");
1407             output_line("#define yytname yyname");
1408         }
1409     }
1410     else
1411     {
1412         output_line("#if YYDEBUG");
1413     }
1414
1415     start_str_table("name");
1416     j = 80;
1417     for (i = 0; i <= max + 1; ++i)
1418     {
1419         if ((s = symnam[i]) != 0)
1420         {
1421             if (s[0] == '"')
1422             {
1423                 k = 7;
1424                 while (*++s != '"')
1425                 {
1426                     ++k;
1427                     if (*s == '\\')
1428                     {
1429                         k += 2;
1430                         if (*++s == '\\')
1431                             ++k;
1432                     }
1433                 }
1434                 j += k;
1435                 if (j > 80)
1436                 {
1437                     output_newline();
1438                     j = k;
1439                 }
1440                 fprintf(output_file, "\"\\\"");
1441                 s = symnam[i];
1442                 while (*++s != '"')
1443                 {
1444                     if (*s == '\\')
1445                     {
1446                         fprintf(output_file, "\\\\");
1447                         if (*++s == '\\')
1448                             fprintf(output_file, "\\\\");
1449                         else
1450                             putc(*s, output_file);
1451                     }
1452                     else
1453                         putc(*s, output_file);
1454                 }
1455                 fprintf(output_file, "\\\"\",");
1456             }
1457             else if (s[0] == '\'')
1458             {
1459                 if (s[1] == '"')
1460                 {
1461                     j += 7;
1462                     if (j > 80)
1463                     {
1464                         output_newline();
1465                         j = 7;
1466                     }
1467                     fprintf(output_file, "\"'\\\"'\",");
1468                 }
1469                 else
1470                 {
1471                     k = 5;
1472                     while (*++s != '\'')
1473                     {
1474                         ++k;
1475                         if (*s == '\\')
1476                         {
1477                             k += 2;
1478                             if (*++s == '\\')
1479                                 ++k;
1480                         }
1481                     }
1482                     j += k;
1483                     if (j > 80)
1484                     {
1485                         output_newline();
1486                         j = k;
1487                     }
1488                     fprintf(output_file, "\"'");
1489                     s = symnam[i];
1490                     while (*++s != '\'')
1491                     {
1492                         if (*s == '\\')
1493                         {
1494                             fprintf(output_file, "\\\\");
1495                             if (*++s == '\\')
1496                                 fprintf(output_file, "\\\\");
1497                             else
1498                                 putc(*s, output_file);
1499                         }
1500                         else
1501                             putc(*s, output_file);
1502                     }
1503                     fprintf(output_file, "'\",");
1504                 }
1505             }
1506             else
1507             {
1508                 k = (int)strlen(s) + 3;
1509                 j += k;
1510                 if (j > 80)
1511                 {
1512                     output_newline();
1513                     j = k;
1514                 }
1515                 putc('"', output_file);
1516                 do
1517                 {
1518                     putc(*s, output_file);
1519                 }
1520                 while (*++s);
1521                 fprintf(output_file, "\",");
1522             }
1523         }
1524         else
1525         {
1526             j += 2;
1527             if (j > 80)
1528             {
1529                 output_newline();
1530                 j = 2;
1531             }
1532             fprintf(output_file, "0,");
1533         }
1534     }
1535     end_table();
1536     FREE(symnam);
1537
1538     if (token_table)
1539         output_line("#if YYDEBUG");
1540     start_str_table("rule");
1541     for (i = 2; i < nrules; ++i)
1542     {
1543         fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
1544         for (j = rrhs[i]; ritem[j] > 0; ++j)
1545         {
1546             s = symbol_name[ritem[j]];
1547             if (s[0] == '"')
1548             {
1549                 fprintf(output_file, " \\\"");
1550                 while (*++s != '"')
1551                 {
1552                     if (*s == '\\')
1553                     {
1554                         if (s[1] == '\\')
1555                             fprintf(output_file, "\\\\\\\\");
1556                         else
1557                             fprintf(output_file, "\\\\%c", s[1]);
1558                         ++s;
1559                     }
1560                     else
1561                         putc(*s, output_file);
1562                 }
1563                 fprintf(output_file, "\\\"");
1564             }
1565             else if (s[0] == '\'')
1566             {
1567                 if (s[1] == '"')
1568                     fprintf(output_file, " '\\\"'");
1569                 else if (s[1] == '\\')
1570                 {
1571                     if (s[2] == '\\')
1572                         fprintf(output_file, " '\\\\\\\\");
1573                     else
1574                         fprintf(output_file, " '\\\\%c", s[2]);
1575                     s += 2;
1576                     while (*++s != '\'')
1577                         putc(*s, output_file);
1578                     putc('\'', output_file);
1579                 }
1580                 else
1581                     fprintf(output_file, " '%c'", s[1]);
1582             }
1583             else
1584                 fprintf(output_file, " %s", s);
1585         }
1586         fprintf(output_file, "\",");
1587         output_newline();
1588     }
1589
1590     end_table();
1591     output_line("#endif");
1592 }
1593
1594 #if defined(YYBTYACC)
1595 static void
1596 output_backtracking_parser(FILE * fp)
1597 {
1598     putl_code(fp, "#undef YYBTYACC\n");
1599 #if defined(YYBTYACC)
1600     if (backtrack)
1601     {
1602         putl_code(fp, "#define YYBTYACC 1\n");
1603         putl_code(fp,
1604                   "#define YYDEBUGSTR (yytrial ? YYPREFIX \"debug(trial)\" : YYPREFIX \"debug\")\n");
1605     }
1606     else
1607 #endif
1608     {
1609         putl_code(fp, "#define YYBTYACC 0\n");
1610         putl_code(fp, "#define YYDEBUGSTR YYPREFIX \"debug\"\n");
1611     }
1612 }
1613 #endif
1614
1615 static void
1616 output_pure_parser(FILE * fp)
1617 {
1618     putc_code(fp, '\n');
1619
1620     if (fp == code_file)
1621         ++outline;
1622     fprintf(fp, "#define YYPURE %d\n", pure_parser);
1623     putc_code(fp, '\n');
1624 }
1625
1626 #if defined(YY_NO_LEAKS)
1627 static void
1628 output_no_leaks(FILE * fp)
1629 {
1630     putc_code(fp, '\n');
1631
1632     if (fp == code_file)
1633         ++outline;
1634     fputs("#define YY_NO_LEAKS 1\n", fp);
1635     putc_code(fp, '\n');
1636 }
1637 #endif
1638
1639 static void
1640 output_trailing_text(void)
1641 {
1642     int c, last;
1643     FILE *in;
1644
1645     if (line == 0)
1646         return;
1647
1648     in = input_file;
1649     c = *cptr;
1650     if (c == '\n')
1651     {
1652         ++lineno;
1653         if ((c = getc(in)) == EOF)
1654             return;
1655         write_input_lineno();
1656         putc_code(code_file, c);
1657         last = c;
1658     }
1659     else
1660     {
1661         write_input_lineno();
1662         do
1663         {
1664             putc_code(code_file, c);
1665         }
1666         while ((c = *++cptr) != '\n');
1667         putc_code(code_file, c);
1668         last = '\n';
1669     }
1670
1671     while ((c = getc(in)) != EOF)
1672     {
1673         putc_code(code_file, c);
1674         last = c;
1675     }
1676
1677     if (last != '\n')
1678     {
1679         putc_code(code_file, '\n');
1680     }
1681     write_code_lineno(code_file);
1682 }
1683
1684 static void
1685 output_semantic_actions(void)
1686 {
1687     int c, last;
1688
1689     rewind(action_file);
1690     if ((c = getc(action_file)) == EOF)
1691         return;
1692
1693     last = c;
1694     putc_code(code_file, c);
1695     while ((c = getc(action_file)) != EOF)
1696     {
1697         putc_code(code_file, c);
1698         last = c;
1699     }
1700
1701     if (last != '\n')
1702     {
1703         putc_code(code_file, '\n');
1704     }
1705
1706     write_code_lineno(code_file);
1707 }
1708
1709 static void
1710 output_parse_decl(FILE * fp)
1711 {
1712     putc_code(fp, '\n');
1713     putl_code(fp, "/* compatibility with bison */\n");
1714     putl_code(fp, "#ifdef YYPARSE_PARAM\n");
1715     putl_code(fp, "/* compatibility with FreeBSD */\n");
1716     putl_code(fp, "# ifdef YYPARSE_PARAM_TYPE\n");
1717     putl_code(fp,
1718               "#  define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)\n");
1719     putl_code(fp, "# else\n");
1720     putl_code(fp, "#  define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)\n");
1721     putl_code(fp, "# endif\n");
1722     putl_code(fp, "#else\n");
1723
1724     puts_code(fp, "# define YYPARSE_DECL() yyparse(");
1725     puts_param_types(fp, parse_param, 0);
1726     putl_code(fp, ")\n");
1727
1728     putl_code(fp, "#endif\n");
1729 }
1730
1731 static void
1732 output_lex_decl(FILE * fp)
1733 {
1734     putc_code(fp, '\n');
1735     putl_code(fp, "/* Parameters sent to lex. */\n");
1736     putl_code(fp, "#ifdef YYLEX_PARAM\n");
1737     if (pure_parser)
1738     {
1739         putl_code(fp, "# ifdef YYLEX_PARAM_TYPE\n");
1740 #if defined(YYBTYACC)
1741         if (locations)
1742         {
1743             putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1744                       " YYLTYPE *yylloc,"
1745                       " YYLEX_PARAM_TYPE YYLEX_PARAM)\n");
1746         }
1747         else
1748 #endif
1749         {
1750             putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1751                       " YYLEX_PARAM_TYPE YYLEX_PARAM)\n");
1752         }
1753         putl_code(fp, "# else\n");
1754 #if defined(YYBTYACC)
1755         if (locations)
1756         {
1757             putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1758                       " YYLTYPE *yylloc,"
1759                       " void * YYLEX_PARAM)\n");
1760         }
1761         else
1762 #endif
1763         {
1764             putl_code(fp, "#  define YYLEX_DECL() yylex(YYSTYPE *yylval,"
1765                       " void * YYLEX_PARAM)\n");
1766         }
1767         putl_code(fp, "# endif\n");
1768 #if defined(YYBTYACC)
1769         if (locations)
1770             putl_code(fp,
1771                       "# define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)\n");
1772         else
1773 #endif
1774             putl_code(fp, "# define YYLEX yylex(&yylval, YYLEX_PARAM)\n");
1775     }
1776     else
1777     {
1778         putl_code(fp, "# define YYLEX_DECL() yylex(void *YYLEX_PARAM)\n");
1779         putl_code(fp, "# define YYLEX yylex(YYLEX_PARAM)\n");
1780     }
1781     putl_code(fp, "#else\n");
1782     if (pure_parser && lex_param)
1783     {
1784 #if defined(YYBTYACC)
1785         if (locations)
1786             puts_code(fp,
1787                       "# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLTYPE *yylloc, ");
1788         else
1789 #endif
1790             puts_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval, ");
1791         puts_param_types(fp, lex_param, 0);
1792         putl_code(fp, ")\n");
1793
1794 #if defined(YYBTYACC)
1795         if (locations)
1796             puts_code(fp, "# define YYLEX yylex(&yylval, &yylloc, ");
1797         else
1798 #endif
1799             puts_code(fp, "# define YYLEX yylex(&yylval, ");
1800         puts_param_names(fp, lex_param, 0);
1801         putl_code(fp, ")\n");
1802     }
1803     else if (pure_parser)
1804     {
1805 #if defined(YYBTYACC)
1806         if (locations)
1807         {
1808             putl_code(fp,
1809                       "# define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLTYPE *yylloc)\n");
1810             putl_code(fp, "# define YYLEX yylex(&yylval, &yylloc)\n");
1811         }
1812         else
1813 #endif
1814         {
1815             putl_code(fp, "# define YYLEX_DECL() yylex(YYSTYPE *yylval)\n");
1816             putl_code(fp, "# define YYLEX yylex(&yylval)\n");
1817         }
1818     }
1819     else if (lex_param)
1820     {
1821         puts_code(fp, "# define YYLEX_DECL() yylex(");
1822         puts_param_types(fp, lex_param, 0);
1823         putl_code(fp, ")\n");
1824
1825         puts_code(fp, "# define YYLEX yylex(");
1826         puts_param_names(fp, lex_param, 0);
1827         putl_code(fp, ")\n");
1828     }
1829     else
1830     {
1831         putl_code(fp, "# define YYLEX_DECL() yylex(void)\n");
1832         putl_code(fp, "# define YYLEX yylex()\n");
1833     }
1834     putl_code(fp, "#endif\n");
1835
1836     /*
1837      * Provide a prototype for yylex for the simplest case.  This is done for
1838      * better compatibility with older yacc's, but can be a problem if someone
1839      * uses "static int yylex(void);"
1840      */
1841     if (!pure_parser
1842 #if defined(YYBTYACC)
1843         && !backtrack
1844 #endif
1845         && !strcmp(symbol_prefix, "yy"))
1846     {
1847         putl_code(fp, "\n");
1848         putl_code(fp, "#if !(defined(yylex) || defined(YYSTATE))\n");
1849         putl_code(fp, "int YYLEX_DECL();\n");
1850         putl_code(fp, "#endif\n");
1851     }
1852 }
1853
1854 static void
1855 output_error_decl(FILE * fp)
1856 {
1857     putc_code(fp, '\n');
1858     putl_code(fp, "/* Parameters sent to yyerror. */\n");
1859     putl_code(fp, "#ifndef YYERROR_DECL\n");
1860     puts_code(fp, "#define YYERROR_DECL() yyerror(");
1861 #if defined(YYBTYACC)
1862     if (locations)
1863         puts_code(fp, "YYLTYPE *loc, ");
1864 #endif
1865     puts_param_types(fp, parse_param, 1);
1866     putl_code(fp, "const char *s)\n");
1867     putl_code(fp, "#endif\n");
1868
1869     putl_code(fp, "#ifndef YYERROR_CALL\n");
1870
1871     puts_code(fp, "#define YYERROR_CALL(msg) yyerror(");
1872 #if defined(YYBTYACC)
1873     if (locations)
1874         puts_code(fp, "&yylloc, ");
1875 #endif
1876     puts_param_names(fp, parse_param, 1);
1877     putl_code(fp, "msg)\n");
1878
1879     putl_code(fp, "#endif\n");
1880 }
1881
1882 #if defined(YYBTYACC)
1883 static void
1884 output_yydestruct_decl(FILE * fp)
1885 {
1886     putc_code(fp, '\n');
1887     putl_code(fp, "#ifndef YYDESTRUCT_DECL\n");
1888
1889     puts_code(fp,
1890               "#define YYDESTRUCT_DECL() "
1891               "yydestruct(const char *msg, int psymb, YYSTYPE *val");
1892 #if defined(YYBTYACC)
1893     if (locations)
1894         puts_code(fp, ", YYLTYPE *loc");
1895 #endif
1896     if (parse_param)
1897     {
1898         puts_code(fp, ", ");
1899         puts_param_types(fp, parse_param, 0);
1900     }
1901     putl_code(fp, ")\n");
1902
1903     putl_code(fp, "#endif\n");
1904
1905     putl_code(fp, "#ifndef YYDESTRUCT_CALL\n");
1906
1907     puts_code(fp, "#define YYDESTRUCT_CALL(msg, psymb, val");
1908 #if defined(YYBTYACC)
1909     if (locations)
1910         puts_code(fp, ", loc");
1911 #endif
1912     puts_code(fp, ") yydestruct(msg, psymb, val");
1913 #if defined(YYBTYACC)
1914     if (locations)
1915         puts_code(fp, ", loc");
1916 #endif
1917     if (parse_param)
1918     {
1919         puts_code(fp, ", ");
1920         puts_param_names(fp, parse_param, 0);
1921     }
1922     putl_code(fp, ")\n");
1923
1924     putl_code(fp, "#endif\n");
1925 }
1926
1927 static void
1928 output_initial_action(void)
1929 {
1930     if (initial_action)
1931         fprintf(code_file, "%s\n", initial_action);
1932 }
1933
1934 static void
1935 output_yydestruct_impl(void)
1936 {
1937     int i;
1938     char *s, *destructor_code;
1939
1940     putc_code(code_file, '\n');
1941     putl_code(code_file, "/* Release memory associated with symbol. */\n");
1942     putl_code(code_file, "#if ! defined YYDESTRUCT_IS_DECLARED\n");
1943     putl_code(code_file, "static void\n");
1944     putl_code(code_file, "YYDESTRUCT_DECL()\n");
1945     putl_code(code_file, "{\n");
1946     putl_code(code_file, "    switch (psymb)\n");
1947     putl_code(code_file, "    {\n");
1948     for (i = 2; i < nsyms; ++i)
1949     {
1950         if ((destructor_code = symbol_destructor[i]) != NULL)
1951         {
1952             ++outline;
1953             fprintf(code_file, "\tcase %d:\n", symbol_pval[i]);
1954             /* comprehend the number of lines in the destructor code */
1955             for (s = destructor_code; (s = strchr(s, '\n')) != NULL; s++)
1956                 ++outline;
1957             puts_code(code_file, destructor_code);
1958             putc_code(code_file, '\n');
1959             putl_code(code_file, "\tbreak;\n");
1960             write_code_lineno(code_file);
1961             FREE(destructor_code);
1962         }
1963     }
1964     putl_code(code_file, "    }\n");
1965     putl_code(code_file, "}\n");
1966     putl_code(code_file, "#define YYDESTRUCT_IS_DECLARED 1\n");
1967     putl_code(code_file, "#endif\n");
1968
1969     DO_FREE(symbol_destructor);
1970 }
1971 #endif
1972
1973 static void
1974 free_itemsets(void)
1975 {
1976     core *cp, *next;
1977
1978     FREE(state_table);
1979     for (cp = first_state; cp; cp = next)
1980     {
1981         next = cp->next;
1982         FREE(cp);
1983     }
1984 }
1985
1986 static void
1987 free_shifts(void)
1988 {
1989     shifts *sp, *next;
1990
1991     FREE(shift_table);
1992     for (sp = first_shift; sp; sp = next)
1993     {
1994         next = sp->next;
1995         FREE(sp);
1996     }
1997 }
1998
1999 static void
2000 free_reductions(void)
2001 {
2002     reductions *rp, *next;
2003
2004     FREE(reduction_table);
2005     for (rp = first_reduction; rp; rp = next)
2006     {
2007         next = rp->next;
2008         FREE(rp);
2009     }
2010 }
2011
2012 static void
2013 output_externs(FILE * fp, const char *const section[])
2014 {
2015     int i;
2016     const char *s;
2017
2018     for (i = 0; (s = section[i]) != 0; ++i)
2019     {
2020         /* prefix non-blank lines that don't start with
2021            C pre-processor directives with 'extern ' */
2022         if (*s && (*s != '#'))
2023             fputs("extern\t", fp);
2024         if (fp == code_file)
2025             ++outline;
2026         fprintf(fp, "%s\n", s);
2027     }
2028 }
2029
2030 void
2031 output(void)
2032 {
2033     FILE *fp;
2034
2035     free_itemsets();
2036     free_shifts();
2037     free_reductions();
2038
2039     output_code_lines(code_file, CODE_TOP);
2040 #if defined(YYBTYACC)
2041     output_backtracking_parser(output_file);
2042     if (rflag)
2043         output_backtracking_parser(code_file);
2044 #endif
2045
2046     if (iflag)
2047     {
2048         write_code_lineno(code_file);
2049         ++outline;
2050         fprintf(code_file, "#include \"%s\"\n", externs_file_name);
2051         fp = externs_file;
2052     }
2053     else
2054         fp = code_file;
2055
2056     output_prefix(fp);
2057     output_pure_parser(fp);
2058 #if defined(YY_NO_LEAKS)
2059     output_no_leaks(fp);
2060 #endif
2061     output_stored_text(fp);
2062     output_stype(fp);
2063 #if defined(YYBTYACC)
2064     if (locations)
2065         output_ltype(fp);
2066 #endif
2067     output_parse_decl(fp);
2068     output_lex_decl(fp);
2069     output_error_decl(fp);
2070 #if defined(YYBTYACC)
2071     if (destructor)
2072         output_yydestruct_decl(fp);
2073 #endif
2074     if (iflag || !rflag)
2075     {
2076         write_section(fp, xdecls);
2077     }
2078
2079     if (iflag)
2080     {
2081         fprintf(externs_file, "\n");
2082         output_yydebug(externs_file);
2083         output_externs(externs_file, global_vars);
2084         if (!pure_parser)
2085             output_externs(externs_file, impure_vars);
2086         if (dflag)
2087         {
2088             ++outline;
2089             fprintf(code_file, "#include \"%s\"\n", defines_file_name);
2090         }
2091         else
2092             output_defines(externs_file);
2093     }
2094     else
2095     {
2096         putc_code(code_file, '\n');
2097         output_defines(code_file);
2098     }
2099
2100     if (dflag)
2101     {
2102         start_defines_file();
2103         output_defines(defines_file);
2104         end_defines_file();
2105     }
2106
2107     output_rule_data();
2108     output_yydefred();
2109 #if defined(YYBTYACC)
2110     output_accessing_symbols();
2111 #endif
2112     output_actions();
2113     free_parser();
2114     output_debug();
2115
2116     if (rflag)
2117     {
2118         write_section(code_file, xdecls);
2119         output_YYINT_typedef(code_file);
2120         write_section(code_file, tables);
2121     }
2122
2123     write_section(code_file, global_vars);
2124     if (!pure_parser)
2125     {
2126         write_section(code_file, impure_vars);
2127     }
2128     output_code_lines(code_file, CODE_REQUIRES);
2129
2130     write_section(code_file, hdr_defs);
2131     if (!pure_parser)
2132     {
2133         write_section(code_file, hdr_vars);
2134     }
2135
2136     output_code_lines(code_file, CODE_PROVIDES);
2137     output_code_lines(code_file, CODE_HEADER);
2138
2139     output_trailing_text();
2140 #if defined(YYBTYACC)
2141     if (destructor)
2142         output_yydestruct_impl();
2143 #endif
2144     write_section(code_file, body_1);
2145     if (pure_parser)
2146     {
2147         write_section(code_file, body_vars);
2148     }
2149     write_section(code_file, body_2);
2150     if (pure_parser)
2151     {
2152         write_section(code_file, init_vars);
2153     }
2154 #if defined(YYBTYACC)
2155     if (initial_action)
2156         output_initial_action();
2157 #endif
2158     write_section(code_file, body_3);
2159     output_semantic_actions();
2160     write_section(code_file, trailer);
2161 }
2162
2163 #ifdef NO_LEAKS
2164 void
2165 output_leaks(void)
2166 {
2167     DO_FREE(tally);
2168     DO_FREE(width);
2169     DO_FREE(order);
2170 }
2171 #endif