]> git.saurik.com Git - bison.git/blame_incremental - src/output.c
Really remove parse-skel.y.
[bison.git] / src / output.c
... / ...
CommitLineData
1/* Output the generated parsing program for bison,
2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22
23/* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
25 are set.
26
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
29
30 ++ YYTNAME = vector of string-names indexed by bison token number.
31
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
34
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
37
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
40
41 YYPRHS[R] = index in YYRHS of first item for rule R.
42
43 YYR1[R] = symbol number of symbol that rule R derives.
44
45 YYR2[R] = number of symbols composing right hand side of rule R.
46
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
49
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
52 error.
53
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
56 something else to do.
57
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
60 out what to do.
61
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
64
65 If the value is negative, it is minus a rule number to reduce by.
66
67 If the value is zero, the default action from YYDEFACT[S] is used.
68
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
74
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
77
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
80 examine.
81
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
87
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
90
91#include "system.h"
92#include "quotearg.h"
93#include "error.h"
94#include "getargs.h"
95#include "files.h"
96#include "gram.h"
97#include "LR0.h"
98#include "complain.h"
99#include "output.h"
100#include "lalr.h"
101#include "reader.h"
102#include "symtab.h"
103#include "conflicts.h"
104#include "muscle_tab.h"
105
106/* From lib/readpipe.h. */
107FILE *readpipe PARAMS ((const char *, ...));
108
109/* From src/scan-skel.l. */
110int skel_lex PARAMS ((void));
111extern FILE *skel_in;
112
113static int nvectors;
114static int nentries;
115static short **froms = NULL;
116static short **tos = NULL;
117static short *tally = NULL;
118static short *width = NULL;
119static short *actrow = NULL;
120static short *state_count = NULL;
121static short *order = NULL;
122static short *base = NULL;
123static short *pos = NULL;
124static short *table = NULL;
125static short *check = NULL;
126static int lowzero;
127static int high;
128
129struct obstack muscle_obstack;
130static struct obstack format_obstack;
131
132int error_verbose = 0;
133
134/* Returns the number of lines of S. */
135size_t
136get_lines_number (const char *s)
137{
138 size_t lines = 0;
139
140 size_t i;
141 for (i = 0; s[i]; ++i)
142 if (s[i] == '\n')
143 ++lines;
144
145 return lines;
146}
147
148
149/* FIXME. */
150
151static inline void
152output_table_data (struct obstack *oout,
153 short *table_data,
154 short first,
155 int begin,
156 int end)
157{
158 int i;
159 int j = 1;
160
161 obstack_fgrow1 (oout, "%6d", first);
162 for (i = begin; i < end; ++i)
163 {
164 obstack_1grow (oout, ',');
165 if (j >= 10)
166 {
167 obstack_sgrow (oout, "\n ");
168 j = 1;
169 }
170 else
171 ++j;
172 obstack_fgrow1 (oout, "%6d", table_data[i]);
173 }
174 obstack_1grow (oout, 0);
175}
176
177
178static void
179output_token_translations (void)
180{
181 output_table_data (&format_obstack, token_translations,
182 0, 1, max_user_token_number + 1);
183 muscle_insert ("translate", obstack_finish (&format_obstack));
184 XFREE (token_translations);
185}
186
187
188static void
189output_gram (void)
190{
191 {
192 int i;
193 short *values = XCALLOC (short, nrules + 1);
194 for (i = 0; i < nrules + 1; ++i)
195 values[i] = rules[i].rhs;
196 output_table_data (&format_obstack, values,
197 0, 1, nrules + 1);
198 XFREE (values);
199 }
200
201 muscle_insert ("prhs", obstack_finish (&format_obstack));
202
203 {
204 short *yyrhs;
205 int i;
206
207 yyrhs = XMALLOC (short, nritems);
208
209 for (i = 1; i < nritems; ++i)
210 yyrhs[i] = ritem[i] >= 0 ? ritem[i] : -1;
211
212 output_table_data (&format_obstack, yyrhs,
213 ritem[0], 1, nritems);
214 muscle_insert ("rhs", obstack_finish (&format_obstack));
215
216 XFREE (yyrhs);
217 }
218
219#if 0
220 if (!semantic_parser)
221 obstack_sgrow (&table_obstack, "\n#endif\n");
222#endif
223}
224
225
226static void
227output_stos (void)
228{
229 int i;
230 short *values = (short *) alloca (sizeof (short) * nstates);
231 for (i = 0; i < nstates; ++i)
232 values[i] = states[i]->accessing_symbol;
233 output_table_data (&format_obstack, values,
234 0, 1, nstates);
235 muscle_insert ("stos", obstack_finish (&format_obstack));
236}
237
238
239static void
240output_rule_data (void)
241{
242 int i;
243 int j;
244 short *short_tab = NULL;
245
246 {
247 short *values = XCALLOC (short, nrules + 1);
248 for (i = 0; i < nrules + 1; ++i)
249 values[i] = rules[i].line;
250 output_table_data (&format_obstack, values,
251 0, 1, nrules + 1);
252 muscle_insert ("rline", obstack_finish (&format_obstack));
253 XFREE (values);
254 }
255
256
257 j = 0;
258 for (i = 0; i < nsyms; i++)
259 {
260 /* Be sure not to use twice the same quotearg slot. */
261 const char *cp =
262 quotearg_n_style (1, c_quoting_style,
263 quotearg_style (escape_quoting_style, symbols[i]->tag));
264 /* Width of the next token, including the two quotes, the coma
265 and the space. */
266 int strsize = strlen (cp) + 2;
267
268 if (j + strsize > 75)
269 {
270 obstack_sgrow (&format_obstack, "\n ");
271 j = 2;
272 }
273
274 obstack_sgrow (&format_obstack, cp);
275 obstack_sgrow (&format_obstack, ", ");
276 j += strsize;
277 }
278 /* add a NULL entry to list of tokens */
279 obstack_sgrow (&format_obstack, "NULL");
280
281 /* Finish table and store. */
282 obstack_1grow (&format_obstack, 0);
283 muscle_insert ("tname", obstack_finish (&format_obstack));
284
285 /* Output YYTOKNUM. */
286 {
287 short *values = XCALLOC (short, ntokens + 1);
288 for (i = 0; i < ntokens + 1; ++i)
289 values[i] = symbols[i]->user_token_number;
290 output_table_data (&format_obstack, values,
291 0, 1, ntokens + 1);
292 muscle_insert ("toknum", obstack_finish (&format_obstack));
293 XFREE (values);
294 }
295
296
297 /* Output YYR1. */
298 {
299 short *values = XCALLOC (short, nrules + 1);
300 for (i = 0; i < nrules + 1; ++i)
301 values[i] = rules[i].lhs;
302 output_table_data (&format_obstack, values,
303 0, 1, nrules + 1);
304 muscle_insert ("r1", obstack_finish (&format_obstack));
305 XFREE (values);
306 }
307
308 /* Output YYR2. */
309 short_tab = XMALLOC (short, nrules + 1);
310 for (i = 1; i < nrules; i++)
311 short_tab[i] = rules[i + 1].rhs - rules[i].rhs - 1;
312 short_tab[nrules] = nritems - rules[nrules].rhs - 1;
313 output_table_data (&format_obstack, short_tab,
314 0, 1, nrules + 1);
315 muscle_insert ("r2", obstack_finish (&format_obstack));
316 XFREE (short_tab);
317}
318
319/*------------------------------------------------------------------.
320| Decide what to do for each type of token if seen as the lookahead |
321| token in specified state. The value returned is used as the |
322| default action (yydefact) for the state. In addition, actrow is |
323| filled with what to do for each kind of token, index by symbol |
324| number, with zero meaning do the default action. The value |
325| MINSHORT, a very negative number, means this situation is an |
326| error. The parser recognizes this value specially. |
327| |
328| This is where conflicts are resolved. The loop over lookahead |
329| rules considered lower-numbered rules last, and the last rule |
330| considered that likes a token gets to handle it. |
331`------------------------------------------------------------------*/
332
333static int
334action_row (state_t *state)
335{
336 int i;
337 int default_rule = 0;
338 reductions *redp = state->reductions;
339 shifts *shiftp = state->shifts;
340 errs *errp = state->errs;
341 /* set nonzero to inhibit having any default reduction */
342 int nodefault = 0;
343
344 for (i = 0; i < ntokens; i++)
345 actrow[i] = 0;
346
347 if (redp->nreds >= 1)
348 {
349 int j;
350 /* loop over all the rules available here which require
351 lookahead */
352 for (i = state->nlookaheads - 1; i >= 0; --i)
353 /* and find each token which the rule finds acceptable
354 to come next */
355 for (j = 0; j < ntokens; j++)
356 /* and record this rule as the rule to use if that
357 token follows. */
358 if (BITISSET (LA (state->lookaheadsp + i), j))
359 actrow[j] = -LAruleno[state->lookaheadsp + i];
360 }
361
362 /* Now see which tokens are allowed for shifts in this state. For
363 them, record the shift as the thing to do. So shift is preferred
364 to reduce. */
365 for (i = 0; i < shiftp->nshifts; i++)
366 {
367 int symbol;
368 int shift_state = shiftp->shifts[i];
369 if (!shift_state)
370 continue;
371
372 symbol = states[shift_state]->accessing_symbol;
373
374 if (ISVAR (symbol))
375 break;
376
377 actrow[symbol] = shift_state;
378
379 /* Do not use any default reduction if there is a shift for
380 error */
381 if (symbol == error_token_number)
382 nodefault = 1;
383 }
384
385 /* See which tokens are an explicit error in this state (due to
386 %nonassoc). For them, record MINSHORT as the action. */
387 for (i = 0; i < errp->nerrs; i++)
388 {
389 int symbol = errp->errs[i];
390 actrow[symbol] = MINSHORT;
391 }
392
393 /* Now find the most common reduction and make it the default action
394 for this state. */
395
396 if (redp->nreds >= 1 && !nodefault)
397 {
398 if (state->consistent)
399 default_rule = redp->rules[0];
400 else
401 {
402 int max = 0;
403 for (i = 0; i < state->nlookaheads; i++)
404 {
405 int count = 0;
406 int rule = -LAruleno[state->lookaheadsp + i];
407 int j;
408
409 for (j = 0; j < ntokens; j++)
410 if (actrow[j] == rule)
411 count++;
412
413 if (count > max)
414 {
415 max = count;
416 default_rule = rule;
417 }
418 }
419
420 /* actions which match the default are replaced with zero,
421 which means "use the default" */
422
423 if (max > 0)
424 {
425 int j;
426 for (j = 0; j < ntokens; j++)
427 if (actrow[j] == default_rule)
428 actrow[j] = 0;
429
430 default_rule = -default_rule;
431 }
432 }
433 }
434
435 /* If have no default rule, the default is an error.
436 So replace any action which says "error" with "use default". */
437
438 if (default_rule == 0)
439 for (i = 0; i < ntokens; i++)
440 if (actrow[i] == MINSHORT)
441 actrow[i] = 0;
442
443 return default_rule;
444}
445
446
447static void
448save_row (int state)
449{
450 int i;
451 int count;
452 short *sp;
453 short *sp1;
454 short *sp2;
455
456 count = 0;
457 for (i = 0; i < ntokens; i++)
458 if (actrow[i] != 0)
459 count++;
460
461 if (count == 0)
462 return;
463
464 froms[state] = sp1 = sp = XCALLOC (short, count);
465 tos[state] = sp2 = XCALLOC (short, count);
466
467 for (i = 0; i < ntokens; i++)
468 if (actrow[i] != 0)
469 {
470 *sp1++ = i;
471 *sp2++ = actrow[i];
472 }
473
474 tally[state] = count;
475 width[state] = sp1[-1] - sp[0] + 1;
476}
477
478
479/*------------------------------------------------------------------.
480| Figure out the actions for the specified state, indexed by |
481| lookahead token type. |
482| |
483| The YYDEFACT table is output now. The detailed info is saved for |
484| putting into YYTABLE later. |
485`------------------------------------------------------------------*/
486
487static void
488token_actions (void)
489{
490 int i;
491 short *yydefact = XCALLOC (short, nstates);
492
493 actrow = XCALLOC (short, ntokens);
494 for (i = 0; i < nstates; ++i)
495 {
496 yydefact[i] = action_row (states[i]);
497 save_row (i);
498 }
499
500 output_table_data (&format_obstack, yydefact,
501 yydefact[0], 1, nstates);
502 muscle_insert ("defact", obstack_finish (&format_obstack));
503
504 XFREE (actrow);
505 XFREE (yydefact);
506}
507
508
509/*-----------------------------.
510| Output the actions to OOUT. |
511`-----------------------------*/
512
513void
514actions_output (FILE *out)
515{
516 int rule;
517 for (rule = 1; rule < nrules + 1; ++rule)
518 if (rules[rule].action)
519 {
520 fprintf (out, " case %d:\n", rule);
521
522 if (!no_lines_flag)
523 fprintf (out, muscle_find ("linef"),
524 rules[rule].action_line,
525 quotearg_style (c_quoting_style,
526 muscle_find ("filename")));
527 /* As a Bison extension, add the ending semicolon. Since some
528 Yacc don't do that, help people using bison as a Yacc
529 finding their missing semicolons. */
530 fprintf (out, "{ %s%s }\n break;\n\n",
531 rules[rule].action,
532 yacc_flag ? ";" : "");
533 }
534}
535
536
537/*----------------------------.
538| Output the guards to OOUT. |
539`----------------------------*/
540
541void
542guards_output (FILE *out)
543{
544 int rule;
545 for (rule = 1; rule < nrules + 1; ++rule)
546 if (rules[rule].guard)
547 {
548 fprintf (out, " case %d:\n", rule);
549
550 if (!no_lines_flag)
551 fprintf (out, muscle_find ("linef"),
552 rules[rule].guard_line,
553 quotearg_style (c_quoting_style,
554 muscle_find ("filename")));
555 fprintf (out, "{ %s; }\n break;\n\n",
556 rules[rule].guard);
557 }
558}
559
560
561/*---------------------------------------.
562| Output the tokens definition to OOUT. |
563`---------------------------------------*/
564
565void
566token_definitions_output (FILE *out)
567{
568 int i;
569 for (i = 0; i < ntokens; ++i)
570 {
571 bucket *symbol = symbols[i];
572 int number = symbol->user_token_number;
573
574 if (number == SALIAS)
575 continue;
576 /* Skip error token. */
577 if (symbol->value == error_token_number)
578 continue;
579 if (symbol->tag[0] == '\'')
580 continue; /* skip literal character */
581 if (symbol->tag[0] == '\"')
582 {
583 /* use literal string only if given a symbol with an alias */
584 if (symbol->alias)
585 symbol = symbol->alias;
586 else
587 continue;
588 }
589
590 /* Don't #define nonliteral tokens whose names contain periods
591 or '$' (as does the default value of the EOF token). */
592 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
593 continue;
594
595 fprintf (out, "# define %s\t%d\n",
596 symbol->tag, number);
597 if (semantic_parser)
598 /* FIXME: This is probably wrong, and should be just as
599 above. --akim. */
600 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
601 }
602}
603
604
605static void
606save_column (int symbol, int default_state)
607{
608 int i;
609 short *sp;
610 short *sp1;
611 short *sp2;
612 int count;
613 int symno = symbol - ntokens + nstates;
614
615 short begin = goto_map[symbol];
616 short end = goto_map[symbol + 1];
617
618 count = 0;
619 for (i = begin; i < end; i++)
620 if (to_state[i] != default_state)
621 count++;
622
623 if (count == 0)
624 return;
625
626 froms[symno] = sp1 = sp = XCALLOC (short, count);
627 tos[symno] = sp2 = XCALLOC (short, count);
628
629 for (i = begin; i < end; i++)
630 if (to_state[i] != default_state)
631 {
632 *sp1++ = from_state[i];
633 *sp2++ = to_state[i];
634 }
635
636 tally[symno] = count;
637 width[symno] = sp1[-1] - sp[0] + 1;
638}
639
640static int
641default_goto (int symbol)
642{
643 int i;
644 int m = goto_map[symbol];
645 int n = goto_map[symbol + 1];
646 int default_state = -1;
647 int max = 0;
648
649 if (m == n)
650 return -1;
651
652 for (i = 0; i < nstates; i++)
653 state_count[i] = 0;
654
655 for (i = m; i < n; i++)
656 state_count[to_state[i]]++;
657
658 for (i = 0; i < nstates; i++)
659 if (state_count[i] > max)
660 {
661 max = state_count[i];
662 default_state = i;
663 }
664
665 return default_state;
666}
667
668
669/*-------------------------------------------------------------------.
670| Figure out what to do after reducing with each rule, depending on |
671| the saved state from before the beginning of parsing the data that |
672| matched this rule. |
673| |
674| The YYDEFGOTO table is output now. The detailed info is saved for |
675| putting into YYTABLE later. |
676`-------------------------------------------------------------------*/
677
678static void
679goto_actions (void)
680{
681 int i;
682 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
683
684 state_count = XCALLOC (short, nstates);
685 for (i = ntokens; i < nsyms; ++i)
686 {
687 int default_state = default_goto (i);
688 save_column (i, default_state);
689 yydefgoto[i - ntokens] = default_state;
690 }
691
692 output_table_data (&format_obstack, yydefgoto,
693 yydefgoto[0], 1, nsyms - ntokens);
694 muscle_insert ("defgoto", obstack_finish (&format_obstack));
695
696 XFREE (state_count);
697 XFREE (yydefgoto);
698}
699
700
701/* The next few functions decide how to pack the actions and gotos
702 information into yytable. */
703
704static void
705sort_actions (void)
706{
707 int i;
708
709 order = XCALLOC (short, nvectors);
710 nentries = 0;
711
712 for (i = 0; i < nvectors; i++)
713 if (tally[i] > 0)
714 {
715 int k;
716 int t = tally[i];
717 int w = width[i];
718 int j = nentries - 1;
719
720 while (j >= 0 && (width[order[j]] < w))
721 j--;
722
723 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
724 j--;
725
726 for (k = nentries - 1; k > j; k--)
727 order[k + 1] = order[k];
728
729 order[j + 1] = i;
730 nentries++;
731 }
732}
733
734
735static int
736matching_state (int vector)
737{
738 int i = order[vector];
739 int t;
740 int w;
741 int prev;
742
743 if (i >= nstates)
744 return -1;
745
746 t = tally[i];
747 w = width[i];
748
749 for (prev = vector - 1; prev >= 0; prev--)
750 {
751 int j = order[prev];
752 int k;
753 int match = 1;
754
755 if (width[j] != w || tally[j] != t)
756 return -1;
757
758 for (k = 0; match && k < t; k++)
759 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
760 match = 0;
761
762 if (match)
763 return j;
764 }
765
766 return -1;
767}
768
769
770static int
771pack_vector (int vector)
772{
773 int i = order[vector];
774 int j;
775 int t = tally[i];
776 int loc = 0;
777 short *from = froms[i];
778 short *to = tos[i];
779
780 assert (t);
781
782 for (j = lowzero - from[0]; j < MAXTABLE; j++)
783 {
784 int k;
785 int ok = 1;
786
787 for (k = 0; ok && k < t; k++)
788 {
789 loc = j + from[k];
790 if (loc > MAXTABLE)
791 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
792
793 if (table[loc] != 0)
794 ok = 0;
795 }
796
797 for (k = 0; ok && k < vector; k++)
798 if (pos[k] == j)
799 ok = 0;
800
801 if (ok)
802 {
803 for (k = 0; k < t; k++)
804 {
805 loc = j + from[k];
806 table[loc] = to[k];
807 check[loc] = from[k];
808 }
809
810 while (table[lowzero] != 0)
811 lowzero++;
812
813 if (loc > high)
814 high = loc;
815
816 return j;
817 }
818 }
819#define pack_vector_succeeded 0
820 assert (pack_vector_succeeded);
821 return 0;
822}
823
824
825static void
826pack_table (void)
827{
828 int i;
829 int place;
830 int state;
831
832 base = XCALLOC (short, nvectors);
833 pos = XCALLOC (short, nentries);
834 table = XCALLOC (short, MAXTABLE);
835 check = XCALLOC (short, MAXTABLE);
836
837 lowzero = 0;
838 high = 0;
839
840 for (i = 0; i < nvectors; i++)
841 base[i] = MINSHORT;
842
843 for (i = 0; i < MAXTABLE; i++)
844 check[i] = -1;
845
846 for (i = 0; i < nentries; i++)
847 {
848 state = matching_state (i);
849
850 if (state < 0)
851 place = pack_vector (i);
852 else
853 place = base[state];
854
855 pos[i] = place;
856 base[order[i]] = place;
857 }
858
859 for (i = 0; i < nvectors; i++)
860 {
861 XFREE (froms[i]);
862 XFREE (tos[i]);
863 }
864
865 XFREE (froms);
866 XFREE (tos);
867 XFREE (pos);
868}
869
870/* the following functions output yytable, yycheck
871 and the vectors whose elements index the portion starts */
872
873static void
874output_base (void)
875{
876 /* Output pact. */
877 output_table_data (&format_obstack, base,
878 base[0], 1, nstates);
879 muscle_insert ("pact", obstack_finish (&format_obstack));
880
881 /* Output pgoto. */
882 output_table_data (&format_obstack, base,
883 base[nstates], nstates + 1, nvectors);
884 muscle_insert ("pgoto", obstack_finish (&format_obstack));
885
886 XFREE (base);
887}
888
889
890static void
891output_table (void)
892{
893 output_table_data (&format_obstack, table,
894 table[0], 1, high + 1);
895 muscle_insert ("table", obstack_finish (&format_obstack));
896 XFREE (table);
897}
898
899
900static void
901output_check (void)
902{
903 output_table_data (&format_obstack, check,
904 check[0], 1, high + 1);
905 muscle_insert ("check", obstack_finish (&format_obstack));
906 XFREE (check);
907}
908
909/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
910 and yycheck. */
911
912static void
913output_actions (void)
914{
915 int i;
916 nvectors = nstates + nvars;
917
918 froms = XCALLOC (short *, nvectors);
919 tos = XCALLOC (short *, nvectors);
920 tally = XCALLOC (short, nvectors);
921 width = XCALLOC (short, nvectors);
922
923 token_actions ();
924 XFREE (LA);
925 XFREE (LAruleno);
926
927 goto_actions ();
928 XFREE (goto_map + ntokens);
929 XFREE (from_state);
930 XFREE (to_state);
931
932 sort_actions ();
933 pack_table ();
934
935 output_base ();
936 output_table ();
937
938 output_check ();
939
940 for (i = 0; i < nstates; ++i)
941 {
942 free (states[i]->shifts);
943 XFREE (states[i]->reductions);
944 free (states[i]->errs);
945 free (states[i]);
946 }
947 XFREE (states);
948}
949
950\f
951/*---------------------------.
952| Call the skeleton parser. |
953`---------------------------*/
954
955static void
956output_skeleton (void)
957{
958 /* Find the right skeleton file. */
959 if (!skeleton)
960 {
961 if (semantic_parser)
962 skeleton = "bison.hairy";
963 else
964 skeleton = "bison.simple";
965 }
966
967 /* Parse the skeleton file and output the needed parsers. */
968 muscle_insert ("skeleton", skeleton);
969
970 /* Store the definition of all the muscles. */
971 {
972 FILE *muscles_m4 = xfopen ("/tmp/muscles.m4", "w");
973 /* There are no comments, especially not `#': we do want M4 expansion
974 after `#': think of CPP macros! */
975 fprintf (muscles_m4, "m4_changecom()\n");
976 fprintf (muscles_m4, "m4_init()\n");
977
978 fprintf (muscles_m4, "m4_define([b4_actions], \n[[");
979 actions_output (muscles_m4);
980 fprintf (muscles_m4, "]])\n\n");
981
982 fprintf (muscles_m4, "m4_define([b4_guards], \n[[");
983 guards_output (muscles_m4);
984 fprintf (muscles_m4, "]])\n\n");
985
986 fprintf (muscles_m4, "m4_define([b4_tokendef], \n[[");
987 token_definitions_output (muscles_m4);
988 fprintf (muscles_m4, "]])\n\n");
989
990 muscles_m4_output (muscles_m4);
991
992 fprintf (muscles_m4, "m4_wrap([m4_divert_pop(0)])\n");
993 fprintf (muscles_m4, "m4_divert_push(0)dnl\n");
994 xfclose (muscles_m4);
995 }
996
997 /* Invoke m4 on the definition of the muscles, and the skeleton. */
998 {
999 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1000 if (!bison_pkgdatadir)
1001 bison_pkgdatadir = PKGDATADIR;
1002 skel_in = readpipe ("m4",
1003 "-I",
1004 bison_pkgdatadir,
1005 "m4sugar/m4sugar.m4",
1006 "/tmp/muscles.m4",
1007 skeleton,
1008 NULL);
1009 if (!skel_in)
1010 error (EXIT_FAILURE, errno, "cannot run m4");
1011 skel_lex ();
1012 }
1013}
1014
1015static void
1016prepare (void)
1017{
1018 MUSCLE_INSERT_INT ("last", high);
1019 MUSCLE_INSERT_INT ("flag", MINSHORT);
1020 MUSCLE_INSERT_INT ("pure", pure_parser);
1021 MUSCLE_INSERT_INT ("nsym", nsyms);
1022 MUSCLE_INSERT_INT ("debug", debug_flag);
1023 MUSCLE_INSERT_INT ("final", final_state);
1024 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1025 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1026 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1027
1028 /* FIXME: This is wrong: the muscles should decide whether they hold
1029 a copy or not, but the situation is too obscure currently. */
1030 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1031 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1032 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1033 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1034
1035 MUSCLE_INSERT_INT ("nnts", nvars);
1036 MUSCLE_INSERT_INT ("nrules", nrules);
1037 MUSCLE_INSERT_INT ("nstates", nstates);
1038 MUSCLE_INSERT_INT ("ntokens", ntokens);
1039
1040 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1041 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1042}
1043
1044/*-------------------------.
1045| Output the header file. |
1046`-------------------------*/
1047
1048static void
1049header_output (void)
1050{
1051 FILE *out = xfopen (spec_defines_file, "w");
1052 char *macro_name = compute_header_macro ();
1053
1054 fprintf (out, "#ifndef %s\n", macro_name);
1055 fprintf (out, "# define %s\n\n", macro_name);
1056
1057 token_definitions_output (out);
1058 fprintf (out, "\
1059#ifndef YYSTYPE\n\
1060typedef %s
1061yystype;\n\
1062# define YYSTYPE yystype\n\
1063#endif\n",
1064 muscle_find ("stype"));
1065
1066 if (!pure_parser)
1067 fprintf (out, "\nextern YYSTYPE %slval;\n",
1068 spec_name_prefix ? spec_name_prefix : "yy");
1069
1070 if (locations_flag)
1071 {
1072 fputs ("\n\n", out);
1073 fprintf (out, "\
1074#ifndef YYLTYPE\n\
1075typedef struct yyltype\n\
1076{\n\
1077 int first_line;\n\
1078 int first_column;\n\
1079 int last_line;\n\
1080 int last_column;\n\
1081} yyltype;\n\
1082# define YYLTYPE yyltype\n\
1083#endif\n");
1084 if (!pure_parser)
1085 fprintf (out, "\nextern YYLTYPE %slloc;\n",
1086 spec_name_prefix ? spec_name_prefix : "yy");
1087 }
1088
1089 if (semantic_parser)
1090 {
1091 int i;
1092
1093 for (i = ntokens; i < nsyms; i++)
1094 /* don't make these for dummy nonterminals made by gensym. */
1095 if (*symbols[i]->tag != '@')
1096 fprintf (out, "# define NT%s\t%d\n", symbols[i]->tag, i);
1097 }
1098
1099 fprintf (out, "\n#endif /* not %s */\n", macro_name);
1100 free (macro_name);
1101 xfclose (out);
1102}
1103
1104
1105/*----------------------------------------------------------.
1106| Output the parsing tables and the parser code to ftable. |
1107`----------------------------------------------------------*/
1108
1109void
1110output (void)
1111{
1112 obstack_init (&format_obstack);
1113
1114 output_token_translations ();
1115 output_gram ();
1116
1117 XFREE (ritem);
1118 if (semantic_parser)
1119 output_stos ();
1120 output_rule_data ();
1121 output_actions ();
1122
1123 prepare ();
1124 /* Copy definitions in directive. */
1125 obstack_1grow (&attrs_obstack, 0);
1126 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1127
1128 /* Process the selected skeleton file. */
1129 output_skeleton ();
1130
1131 /* Output the header if needed. */
1132
1133 if (0)
1134 header_output ();
1135
1136 free (rules + 1);
1137 obstack_free (&muscle_obstack, NULL);
1138 obstack_free (&format_obstack, NULL);
1139 obstack_free (&action_obstack, NULL);
1140 obstack_free (&attrs_obstack, NULL);
1141}