]> git.saurik.com Git - bison.git/blame_incremental - src/output.c
* src/closure.c (firsts): Now, also a bitset.
[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 (well, 0, as NULL might not be
279 defined). */
280 obstack_sgrow (&format_obstack, "0");
281
282 /* Finish table and store. */
283 obstack_1grow (&format_obstack, 0);
284 muscle_insert ("tname", obstack_finish (&format_obstack));
285
286 /* Output YYTOKNUM. */
287 {
288 short *values = XCALLOC (short, ntokens + 1);
289 for (i = 0; i < ntokens + 1; ++i)
290 values[i] = symbols[i]->user_token_number;
291 output_table_data (&format_obstack, values,
292 0, 1, ntokens + 1);
293 muscle_insert ("toknum", obstack_finish (&format_obstack));
294 XFREE (values);
295 }
296
297
298 /* Output YYR1. */
299 {
300 short *values = XCALLOC (short, nrules + 1);
301 for (i = 0; i < nrules + 1; ++i)
302 values[i] = rules[i].lhs;
303 output_table_data (&format_obstack, values,
304 0, 1, nrules + 1);
305 muscle_insert ("r1", obstack_finish (&format_obstack));
306 XFREE (values);
307 }
308
309 /* Output YYR2. */
310 short_tab = XMALLOC (short, nrules + 1);
311 for (i = 1; i < nrules; i++)
312 short_tab[i] = rules[i + 1].rhs - rules[i].rhs - 1;
313 short_tab[nrules] = nritems - rules[nrules].rhs - 1;
314 output_table_data (&format_obstack, short_tab,
315 0, 1, nrules + 1);
316 muscle_insert ("r2", obstack_finish (&format_obstack));
317 XFREE (short_tab);
318}
319
320/*------------------------------------------------------------------.
321| Decide what to do for each type of token if seen as the lookahead |
322| token in specified state. The value returned is used as the |
323| default action (yydefact) for the state. In addition, actrow is |
324| filled with what to do for each kind of token, index by symbol |
325| number, with zero meaning do the default action. The value |
326| MINSHORT, a very negative number, means this situation is an |
327| error. The parser recognizes this value specially. |
328| |
329| This is where conflicts are resolved. The loop over lookahead |
330| rules considered lower-numbered rules last, and the last rule |
331| considered that likes a token gets to handle it. |
332`------------------------------------------------------------------*/
333
334static int
335action_row (state_t *state)
336{
337 int i;
338 int default_rule = 0;
339 reductions *redp = state->reductions;
340 shifts *shiftp = state->shifts;
341 errs *errp = state->errs;
342 /* set nonzero to inhibit having any default reduction */
343 int nodefault = 0;
344
345 for (i = 0; i < ntokens; i++)
346 actrow[i] = 0;
347
348 if (redp->nreds >= 1)
349 {
350 int j;
351 /* loop over all the rules available here which require
352 lookahead */
353 for (i = state->nlookaheads - 1; i >= 0; --i)
354 /* and find each token which the rule finds acceptable
355 to come next */
356 for (j = 0; j < ntokens; j++)
357 /* and record this rule as the rule to use if that
358 token follows. */
359 if (BITISSET (LA (state->lookaheadsp + i), j))
360 actrow[j] = -LAruleno[state->lookaheadsp + i];
361 }
362
363 /* Now see which tokens are allowed for shifts in this state. For
364 them, record the shift as the thing to do. So shift is preferred
365 to reduce. */
366 for (i = 0; i < shiftp->nshifts; i++)
367 {
368 int symbol;
369 int shift_state = shiftp->shifts[i];
370 if (!shift_state)
371 continue;
372
373 symbol = states[shift_state]->accessing_symbol;
374
375 if (ISVAR (symbol))
376 break;
377
378 actrow[symbol] = shift_state;
379
380 /* Do not use any default reduction if there is a shift for
381 error */
382 if (symbol == error_token_number)
383 nodefault = 1;
384 }
385
386 /* See which tokens are an explicit error in this state (due to
387 %nonassoc). For them, record MINSHORT as the action. */
388 for (i = 0; i < errp->nerrs; i++)
389 {
390 int symbol = errp->errs[i];
391 actrow[symbol] = MINSHORT;
392 }
393
394 /* Now find the most common reduction and make it the default action
395 for this state. */
396
397 if (redp->nreds >= 1 && !nodefault)
398 {
399 if (state->consistent)
400 default_rule = redp->rules[0];
401 else
402 {
403 int max = 0;
404 for (i = 0; i < state->nlookaheads; i++)
405 {
406 int count = 0;
407 int rule = -LAruleno[state->lookaheadsp + i];
408 int j;
409
410 for (j = 0; j < ntokens; j++)
411 if (actrow[j] == rule)
412 count++;
413
414 if (count > max)
415 {
416 max = count;
417 default_rule = rule;
418 }
419 }
420
421 /* actions which match the default are replaced with zero,
422 which means "use the default" */
423
424 if (max > 0)
425 {
426 int j;
427 for (j = 0; j < ntokens; j++)
428 if (actrow[j] == default_rule)
429 actrow[j] = 0;
430
431 default_rule = -default_rule;
432 }
433 }
434 }
435
436 /* If have no default rule, the default is an error.
437 So replace any action which says "error" with "use default". */
438
439 if (default_rule == 0)
440 for (i = 0; i < ntokens; i++)
441 if (actrow[i] == MINSHORT)
442 actrow[i] = 0;
443
444 return default_rule;
445}
446
447
448static void
449save_row (int state)
450{
451 int i;
452 int count;
453 short *sp;
454 short *sp1;
455 short *sp2;
456
457 count = 0;
458 for (i = 0; i < ntokens; i++)
459 if (actrow[i] != 0)
460 count++;
461
462 if (count == 0)
463 return;
464
465 froms[state] = sp1 = sp = XCALLOC (short, count);
466 tos[state] = sp2 = XCALLOC (short, count);
467
468 for (i = 0; i < ntokens; i++)
469 if (actrow[i] != 0)
470 {
471 *sp1++ = i;
472 *sp2++ = actrow[i];
473 }
474
475 tally[state] = count;
476 width[state] = sp1[-1] - sp[0] + 1;
477}
478
479
480/*------------------------------------------------------------------.
481| Figure out the actions for the specified state, indexed by |
482| lookahead token type. |
483| |
484| The YYDEFACT table is output now. The detailed info is saved for |
485| putting into YYTABLE later. |
486`------------------------------------------------------------------*/
487
488static void
489token_actions (void)
490{
491 int i;
492 short *yydefact = XCALLOC (short, nstates);
493
494 actrow = XCALLOC (short, ntokens);
495 for (i = 0; i < nstates; ++i)
496 {
497 yydefact[i] = action_row (states[i]);
498 save_row (i);
499 }
500
501 output_table_data (&format_obstack, yydefact,
502 yydefact[0], 1, nstates);
503 muscle_insert ("defact", obstack_finish (&format_obstack));
504
505 XFREE (actrow);
506 XFREE (yydefact);
507}
508
509
510/*-----------------------------.
511| Output the actions to OOUT. |
512`-----------------------------*/
513
514void
515actions_output (FILE *out)
516{
517 int rule;
518 for (rule = 1; rule < nrules + 1; ++rule)
519 if (rules[rule].action)
520 {
521 fprintf (out, " case %d:\n", rule);
522
523 if (!no_lines_flag)
524 fprintf (out, muscle_find ("linef"),
525 rules[rule].action_line,
526 quotearg_style (c_quoting_style,
527 muscle_find ("filename")));
528 /* As a Bison extension, add the ending semicolon. Since some
529 Yacc don't do that, help people using bison as a Yacc
530 finding their missing semicolons. */
531 fprintf (out, "{ %s%s }\n break;\n\n",
532 rules[rule].action,
533 yacc_flag ? ";" : "");
534 }
535}
536
537
538/*----------------------------.
539| Output the guards to OOUT. |
540`----------------------------*/
541
542void
543guards_output (FILE *out)
544{
545 int rule;
546 for (rule = 1; rule < nrules + 1; ++rule)
547 if (rules[rule].guard)
548 {
549 fprintf (out, " case %d:\n", rule);
550
551 if (!no_lines_flag)
552 fprintf (out, muscle_find ("linef"),
553 rules[rule].guard_line,
554 quotearg_style (c_quoting_style,
555 muscle_find ("filename")));
556 fprintf (out, "{ %s; }\n break;\n\n",
557 rules[rule].guard);
558 }
559}
560
561
562/*---------------------------------------.
563| Output the tokens definition to OOUT. |
564`---------------------------------------*/
565
566void
567token_definitions_output (FILE *out)
568{
569 int i;
570 for (i = 0; i < ntokens; ++i)
571 {
572 bucket *symbol = symbols[i];
573 int number = symbol->user_token_number;
574
575 if (number == SALIAS)
576 continue;
577 /* Skip error token. */
578 if (symbol->value == error_token_number)
579 continue;
580 if (symbol->tag[0] == '\'')
581 continue; /* skip literal character */
582 if (symbol->tag[0] == '\"')
583 {
584 /* use literal string only if given a symbol with an alias */
585 if (symbol->alias)
586 symbol = symbol->alias;
587 else
588 continue;
589 }
590
591 /* Don't #define nonliteral tokens whose names contain periods
592 or '$' (as does the default value of the EOF token). */
593 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
594 continue;
595
596 fprintf (out, "# define %s\t%d\n",
597 symbol->tag, number);
598 if (semantic_parser)
599 /* FIXME: This is probably wrong, and should be just as
600 above. --akim. */
601 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
602 }
603}
604
605
606static void
607save_column (int symbol, int default_state)
608{
609 int i;
610 short *sp;
611 short *sp1;
612 short *sp2;
613 int count;
614 int symno = symbol - ntokens + nstates;
615
616 short begin = goto_map[symbol];
617 short end = goto_map[symbol + 1];
618
619 count = 0;
620 for (i = begin; i < end; i++)
621 if (to_state[i] != default_state)
622 count++;
623
624 if (count == 0)
625 return;
626
627 froms[symno] = sp1 = sp = XCALLOC (short, count);
628 tos[symno] = sp2 = XCALLOC (short, count);
629
630 for (i = begin; i < end; i++)
631 if (to_state[i] != default_state)
632 {
633 *sp1++ = from_state[i];
634 *sp2++ = to_state[i];
635 }
636
637 tally[symno] = count;
638 width[symno] = sp1[-1] - sp[0] + 1;
639}
640
641static int
642default_goto (int symbol)
643{
644 int i;
645 int m = goto_map[symbol];
646 int n = goto_map[symbol + 1];
647 int default_state = -1;
648 int max = 0;
649
650 if (m == n)
651 return -1;
652
653 for (i = 0; i < nstates; i++)
654 state_count[i] = 0;
655
656 for (i = m; i < n; i++)
657 state_count[to_state[i]]++;
658
659 for (i = 0; i < nstates; i++)
660 if (state_count[i] > max)
661 {
662 max = state_count[i];
663 default_state = i;
664 }
665
666 return default_state;
667}
668
669
670/*-------------------------------------------------------------------.
671| Figure out what to do after reducing with each rule, depending on |
672| the saved state from before the beginning of parsing the data that |
673| matched this rule. |
674| |
675| The YYDEFGOTO table is output now. The detailed info is saved for |
676| putting into YYTABLE later. |
677`-------------------------------------------------------------------*/
678
679static void
680goto_actions (void)
681{
682 int i;
683 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
684
685 state_count = XCALLOC (short, nstates);
686 for (i = ntokens; i < nsyms; ++i)
687 {
688 int default_state = default_goto (i);
689 save_column (i, default_state);
690 yydefgoto[i - ntokens] = default_state;
691 }
692
693 output_table_data (&format_obstack, yydefgoto,
694 yydefgoto[0], 1, nsyms - ntokens);
695 muscle_insert ("defgoto", obstack_finish (&format_obstack));
696
697 XFREE (state_count);
698 XFREE (yydefgoto);
699}
700
701
702/* The next few functions decide how to pack the actions and gotos
703 information into yytable. */
704
705static void
706sort_actions (void)
707{
708 int i;
709
710 order = XCALLOC (short, nvectors);
711 nentries = 0;
712
713 for (i = 0; i < nvectors; i++)
714 if (tally[i] > 0)
715 {
716 int k;
717 int t = tally[i];
718 int w = width[i];
719 int j = nentries - 1;
720
721 while (j >= 0 && (width[order[j]] < w))
722 j--;
723
724 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
725 j--;
726
727 for (k = nentries - 1; k > j; k--)
728 order[k + 1] = order[k];
729
730 order[j + 1] = i;
731 nentries++;
732 }
733}
734
735
736static int
737matching_state (int vector)
738{
739 int i = order[vector];
740 int t;
741 int w;
742 int prev;
743
744 if (i >= nstates)
745 return -1;
746
747 t = tally[i];
748 w = width[i];
749
750 for (prev = vector - 1; prev >= 0; prev--)
751 {
752 int j = order[prev];
753 int k;
754 int match = 1;
755
756 if (width[j] != w || tally[j] != t)
757 return -1;
758
759 for (k = 0; match && k < t; k++)
760 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
761 match = 0;
762
763 if (match)
764 return j;
765 }
766
767 return -1;
768}
769
770
771static int
772pack_vector (int vector)
773{
774 int i = order[vector];
775 int j;
776 int t = tally[i];
777 int loc = 0;
778 short *from = froms[i];
779 short *to = tos[i];
780
781 assert (t);
782
783 for (j = lowzero - from[0]; j < MAXTABLE; j++)
784 {
785 int k;
786 int ok = 1;
787
788 for (k = 0; ok && k < t; k++)
789 {
790 loc = j + from[k];
791 if (loc > MAXTABLE)
792 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
793
794 if (table[loc] != 0)
795 ok = 0;
796 }
797
798 for (k = 0; ok && k < vector; k++)
799 if (pos[k] == j)
800 ok = 0;
801
802 if (ok)
803 {
804 for (k = 0; k < t; k++)
805 {
806 loc = j + from[k];
807 table[loc] = to[k];
808 check[loc] = from[k];
809 }
810
811 while (table[lowzero] != 0)
812 lowzero++;
813
814 if (loc > high)
815 high = loc;
816
817 return j;
818 }
819 }
820#define pack_vector_succeeded 0
821 assert (pack_vector_succeeded);
822 return 0;
823}
824
825
826static void
827pack_table (void)
828{
829 int i;
830 int place;
831 int state;
832
833 base = XCALLOC (short, nvectors);
834 pos = XCALLOC (short, nentries);
835 table = XCALLOC (short, MAXTABLE);
836 check = XCALLOC (short, MAXTABLE);
837
838 lowzero = 0;
839 high = 0;
840
841 for (i = 0; i < nvectors; i++)
842 base[i] = MINSHORT;
843
844 for (i = 0; i < MAXTABLE; i++)
845 check[i] = -1;
846
847 for (i = 0; i < nentries; i++)
848 {
849 state = matching_state (i);
850
851 if (state < 0)
852 place = pack_vector (i);
853 else
854 place = base[state];
855
856 pos[i] = place;
857 base[order[i]] = place;
858 }
859
860 for (i = 0; i < nvectors; i++)
861 {
862 XFREE (froms[i]);
863 XFREE (tos[i]);
864 }
865
866 XFREE (froms);
867 XFREE (tos);
868 XFREE (pos);
869}
870
871/* the following functions output yytable, yycheck
872 and the vectors whose elements index the portion starts */
873
874static void
875output_base (void)
876{
877 /* Output pact. */
878 output_table_data (&format_obstack, base,
879 base[0], 1, nstates);
880 muscle_insert ("pact", obstack_finish (&format_obstack));
881
882 /* Output pgoto. */
883 output_table_data (&format_obstack, base,
884 base[nstates], nstates + 1, nvectors);
885 muscle_insert ("pgoto", obstack_finish (&format_obstack));
886
887 XFREE (base);
888}
889
890
891static void
892output_table (void)
893{
894 output_table_data (&format_obstack, table,
895 table[0], 1, high + 1);
896 muscle_insert ("table", obstack_finish (&format_obstack));
897 XFREE (table);
898}
899
900
901static void
902output_check (void)
903{
904 output_table_data (&format_obstack, check,
905 check[0], 1, high + 1);
906 muscle_insert ("check", obstack_finish (&format_obstack));
907 XFREE (check);
908}
909
910/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
911 and yycheck. */
912
913static void
914output_actions (void)
915{
916 int i;
917 nvectors = nstates + nvars;
918
919 froms = XCALLOC (short *, nvectors);
920 tos = XCALLOC (short *, nvectors);
921 tally = XCALLOC (short, nvectors);
922 width = XCALLOC (short, nvectors);
923
924 token_actions ();
925 XFREE (LA);
926 XFREE (LAruleno);
927
928 goto_actions ();
929 XFREE (goto_map + ntokens);
930 XFREE (from_state);
931 XFREE (to_state);
932
933 sort_actions ();
934 pack_table ();
935
936 output_base ();
937 output_table ();
938
939 output_check ();
940
941 for (i = 0; i < nstates; ++i)
942 {
943 free (states[i]->shifts);
944 XFREE (states[i]->reductions);
945 free (states[i]->errs);
946 free (states[i]);
947 }
948 XFREE (states);
949}
950
951\f
952/*---------------------------.
953| Call the skeleton parser. |
954`---------------------------*/
955
956static void
957output_skeleton (void)
958{
959 /* Store the definition of all the muscles. */
960 char *tempdir = getenv ("TMPDIR");
961 char *tempfile = NULL;
962 FILE *out = NULL;
963 ssize_t bytes_read;
964 int fd;
965
966 if (tempdir == NULL)
967 tempdir = DEFAULT_TMPDIR;
968 tempfile = xmalloc (strlen (tempdir) + 11);
969 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
970 fd = mkstemp (tempfile);
971 if (fd == -1)
972 error (EXIT_FAILURE, errno, "%s", tempfile);
973
974 out = fdopen (fd, "w");
975 if (out == NULL)
976 error (EXIT_FAILURE, errno, "%s", tempfile);
977
978 /* There are no comments, especially not `#': we do want M4 expansion
979 after `#': think of CPP macros! */
980 fputs ("m4_changecom()\n", out);
981 fputs ("m4_init()\n", out);
982
983 fputs ("m4_define([b4_actions], \n[[", out);
984 actions_output (out);
985 fputs ("]])\n\n", out);
986
987 fputs ("m4_define([b4_guards], \n[[", out);
988 guards_output (out);
989 fputs ("]])\n\n", out);
990
991 fputs ("m4_define([b4_tokendef], \n[[", out);
992 token_definitions_output (out);
993 fputs ("]])\n\n", out);
994
995 muscles_m4_output (out);
996
997 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
998 fputs ("m4_divert_push(0)dnl\n", out);
999 xfclose (out);
1000
1001 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1002 {
1003 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1004 const char *m4 = getenv ("M4");
1005 if (!m4)
1006 m4 = M4;
1007 if (!bison_pkgdatadir)
1008 bison_pkgdatadir = PKGDATADIR;
1009 if (trace_flag)
1010 fprintf (stderr,
1011 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1012 m4, bison_pkgdatadir, tempfile, skeleton);
1013 skel_in = readpipe (m4,
1014 "-I", bison_pkgdatadir,
1015 "m4sugar/m4sugar.m4",
1016 tempfile,
1017 skeleton,
1018 NULL);
1019 if (!skel_in)
1020 error (EXIT_FAILURE, errno, "cannot run m4");
1021 skel_lex ();
1022
1023 /* If `debugging', keep this file alive. */
1024 if (!trace_flag)
1025 unlink (tempfile);
1026 }
1027}
1028
1029static void
1030prepare (void)
1031{
1032 MUSCLE_INSERT_INT ("last", high);
1033 MUSCLE_INSERT_INT ("flag", MINSHORT);
1034 MUSCLE_INSERT_INT ("pure", pure_parser);
1035 MUSCLE_INSERT_INT ("nsym", nsyms);
1036 MUSCLE_INSERT_INT ("debug", debug_flag);
1037 MUSCLE_INSERT_INT ("final", final_state);
1038 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1039 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1040 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1041
1042 /* FIXME: This is wrong: the muscles should decide whether they hold
1043 a copy or not, but the situation is too obscure currently. */
1044 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1045 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1046 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1047 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1048
1049 MUSCLE_INSERT_INT ("nnts", nvars);
1050 MUSCLE_INSERT_INT ("nrules", nrules);
1051 MUSCLE_INSERT_INT ("nstates", nstates);
1052 MUSCLE_INSERT_INT ("ntokens", ntokens);
1053
1054 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1055 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1056
1057 /* Copy definitions in directive. */
1058 obstack_1grow (&attrs_obstack, 0);
1059 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1060
1061 /* Find the right skeleton file. */
1062 if (!skeleton)
1063 {
1064 if (semantic_parser)
1065 skeleton = "bison.hairy";
1066 else
1067 skeleton = "bison.simple";
1068 }
1069
1070 /* Parse the skeleton file and output the needed parsers. */
1071 muscle_insert ("skeleton", skeleton);
1072}
1073
1074
1075/*----------------------------------------------------------.
1076| Output the parsing tables and the parser code to ftable. |
1077`----------------------------------------------------------*/
1078
1079void
1080output (void)
1081{
1082 obstack_init (&format_obstack);
1083
1084 output_token_translations ();
1085 output_gram ();
1086
1087 XFREE (ritem);
1088 if (semantic_parser)
1089 output_stos ();
1090 output_rule_data ();
1091 output_actions ();
1092
1093 prepare ();
1094
1095 /* Process the selected skeleton file. */
1096 output_skeleton ();
1097
1098 free (rules + 1);
1099 obstack_free (&muscle_obstack, NULL);
1100 obstack_free (&format_obstack, NULL);
1101 obstack_free (&action_obstack, NULL);
1102 obstack_free (&attrs_obstack, NULL);
1103}