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