]> git.saurik.com Git - bison.git/blob - src/output.c
* data/bison.simple (yyr1): Its type is that of a token number.
[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 | Create a function NAME which Format the FIRST and then |
138 | TABLE_DATA[BEGIN..END[ (of TYPE) into OOUT, and return the number |
139 | of bits needed for its longuest value. |
140 `------------------------------------------------------------------*/
141
142
143 #define GENERATE_OUTPUT_TABLE(Name, Type) \
144 \
145 static inline long int \
146 Name (struct obstack *oout, \
147 Type *table_data, \
148 Type first, \
149 int begin, \
150 int end) \
151 { \
152 long int max = first; \
153 int i; \
154 int j = 1; \
155 \
156 obstack_fgrow1 (oout, "%6d", first); \
157 for (i = begin; i < end; ++i) \
158 { \
159 obstack_1grow (oout, ','); \
160 if (j >= 10) \
161 { \
162 obstack_sgrow (oout, "\n "); \
163 j = 1; \
164 } \
165 else \
166 ++j; \
167 obstack_fgrow1 (oout, "%6d", table_data[i]); \
168 if (table_data[i] > max) \
169 max = table_data[i]; \
170 } \
171 obstack_1grow (oout, 0); \
172 \
173 return max; \
174 }
175
176 GENERATE_OUTPUT_TABLE(output_int_table, int)
177 GENERATE_OUTPUT_TABLE(output_short_table, short)
178 GENERATE_OUTPUT_TABLE(output_token_number_table, token_number_t)
179 GENERATE_OUTPUT_TABLE(output_item_number_table, item_number_t)
180
181
182 /*-----------------------------------------------------------------.
183 | Prepare the muscles related to the tokens: translate, tname, and |
184 | toknum. |
185 `-----------------------------------------------------------------*/
186
187 static void
188 prepare_tokens (void)
189 {
190 long int max = output_token_number_table (&format_obstack,
191 token_translations,
192 0, 1, max_user_token_number + 1);
193 muscle_insert ("translate", obstack_finish (&format_obstack));
194 MUSCLE_INSERT_LONG_INT ("token_number_max", max);
195 XFREE (token_translations);
196
197 {
198 int i;
199 int j = 0;
200 for (i = 0; i < nsyms; i++)
201 {
202 /* Be sure not to use twice the same quotearg slot. */
203 const char *cp =
204 quotearg_n_style (1, c_quoting_style,
205 quotearg_style (escape_quoting_style,
206 symbols[i]->tag));
207 /* Width of the next token, including the two quotes, the coma
208 and the space. */
209 int strsize = strlen (cp) + 2;
210
211 if (j + strsize > 75)
212 {
213 obstack_sgrow (&format_obstack, "\n ");
214 j = 2;
215 }
216
217 obstack_sgrow (&format_obstack, cp);
218 obstack_sgrow (&format_obstack, ", ");
219 j += strsize;
220 }
221 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
222 defined). */
223 obstack_sgrow (&format_obstack, "0");
224
225 /* Finish table and store. */
226 obstack_1grow (&format_obstack, 0);
227 muscle_insert ("tname", obstack_finish (&format_obstack));
228 }
229
230 /* Output YYTOKNUM. */
231 {
232 int i;
233 short *values = XCALLOC (short, ntokens + 1);
234 for (i = 0; i < ntokens + 1; ++i)
235 values[i] = symbols[i]->user_token_number;
236 output_short_table (&format_obstack, values,
237 0, 1, ntokens + 1);
238 muscle_insert ("toknum", obstack_finish (&format_obstack));
239 free (values);
240 }
241 }
242
243
244 /*-------------------------------------------------------------.
245 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
246 | rline. |
247 `-------------------------------------------------------------*/
248
249 static void
250 prepare_rules (void)
251 {
252 long int max;
253 item_number_t *rhsp;
254 int r;
255 int i = 0;
256 item_number_t *rhs = XMALLOC (item_number_t, nritems);
257 short *prhs = XMALLOC (short, nrules + 1);
258 token_number_t *r1 = XMALLOC (token_number_t, nrules + 1);
259 short *r2 = XMALLOC (short, nrules + 1);
260 short *rline = XMALLOC (short, nrules + 1);
261
262 for (r = 1; r < nrules + 1; ++r)
263 {
264 /* Index of rule R in RHS. */
265 prhs[r] = i;
266 /* RHS of the rule R. */
267 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
268 rhs[i++] = *rhsp;
269 /* LHS of the rule R. */
270 r1[r] = rules[r].lhs->number;
271 /* Length of rule R's RHS. */
272 r2[r] = i - prhs[r];
273 /* Separator in RHS. */
274 rhs[i++] = -1;
275 /* Line where rule was defined. */
276 rline[r] = rules[r].line;
277 }
278 assert (i == nritems);
279
280 max = output_int_table (&format_obstack, rhs, ritem[0], 1, nritems);
281 muscle_insert ("rhs", obstack_finish (&format_obstack));
282 MUSCLE_INSERT_LONG_INT ("rhs_number_max", max);
283
284 output_short_table (&format_obstack, prhs, 0, 1, nrules + 1);
285 muscle_insert ("prhs", obstack_finish (&format_obstack));
286
287 output_short_table (&format_obstack, rline, 0, 1, nrules + 1);
288 muscle_insert ("rline", obstack_finish (&format_obstack));
289
290 output_token_number_table (&format_obstack, r1, 0, 1, nrules + 1);
291 muscle_insert ("r1", obstack_finish (&format_obstack));
292
293 output_short_table (&format_obstack, r2, 0, 1, nrules + 1);
294 muscle_insert ("r2", obstack_finish (&format_obstack));
295
296 free (rhs);
297 free (prhs);
298 free (r2);
299 }
300
301 /*--------------------------------------------.
302 | Prepare the muscles related to the states. |
303 `--------------------------------------------*/
304
305 static void
306 prepare_states (void)
307 {
308 size_t i;
309 token_number_t *values =
310 (token_number_t *) alloca (sizeof (token_number_t) * nstates);
311 for (i = 0; i < nstates; ++i)
312 values[i] = states[i]->accessing_symbol;
313 output_token_number_table (&format_obstack, values,
314 0, 1, nstates);
315 muscle_insert ("stos", obstack_finish (&format_obstack));
316 }
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 | SHRT_MIN, 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
333 static int
334 action_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 (bitset_test (LA[state->lookaheadsp + i], j))
359 actrow[j] = -LArule[state->lookaheadsp + i]->number;
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 token_number_t 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 == errtoken->number)
382 nodefault = 1;
383 }
384
385 /* See which tokens are an explicit error in this state (due to
386 %nonassoc). For them, record SHRT_MIN as the action. */
387 for (i = 0; i < errp->nerrs; i++)
388 {
389 int symbol = errp->errs[i];
390 actrow[symbol] = SHRT_MIN;
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 = -LArule[state->lookaheadsp + i]->number;
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] == SHRT_MIN)
441 actrow[i] = 0;
442
443 return default_rule;
444 }
445
446
447 static void
448 save_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
487 static void
488 token_actions (void)
489 {
490 size_t 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_short_table (&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
513 void
514 actions_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
541 void
542 guards_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
565 void
566 token_definitions_output (FILE *out)
567 {
568 int i;
569 int first = 1;
570 for (i = 0; i < ntokens; ++i)
571 {
572 symbol_t *symbol = symbols[i];
573 int number = symbol->user_token_number;
574
575 if (number == SALIAS)
576 continue;
577 /* Skip error token. */
578 if (symbol == errtoken)
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, "%s [[[%s]], [%d]]",
597 first ? "" : ",\n", 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->number);
602 first = 0;
603 }
604 }
605
606
607 static void
608 save_column (int symbol, int default_state)
609 {
610 int i;
611 short *sp;
612 short *sp1;
613 short *sp2;
614 int count;
615 int symno = symbol - ntokens + nstates;
616
617 short begin = goto_map[symbol];
618 short end = goto_map[symbol + 1];
619
620 count = 0;
621 for (i = begin; i < end; i++)
622 if (to_state[i] != default_state)
623 count++;
624
625 if (count == 0)
626 return;
627
628 froms[symno] = sp1 = sp = XCALLOC (short, count);
629 tos[symno] = sp2 = XCALLOC (short, count);
630
631 for (i = begin; i < end; i++)
632 if (to_state[i] != default_state)
633 {
634 *sp1++ = from_state[i];
635 *sp2++ = to_state[i];
636 }
637
638 tally[symno] = count;
639 width[symno] = sp1[-1] - sp[0] + 1;
640 }
641
642 static int
643 default_goto (int symbol)
644 {
645 size_t i;
646 size_t m = goto_map[symbol];
647 size_t n = goto_map[symbol + 1];
648 int default_state = -1;
649 int max = 0;
650
651 if (m == n)
652 return -1;
653
654 for (i = 0; i < nstates; i++)
655 state_count[i] = 0;
656
657 for (i = m; i < n; i++)
658 state_count[to_state[i]]++;
659
660 for (i = 0; i < nstates; i++)
661 if (state_count[i] > max)
662 {
663 max = state_count[i];
664 default_state = i;
665 }
666
667 return default_state;
668 }
669
670
671 /*-------------------------------------------------------------------.
672 | Figure out what to do after reducing with each rule, depending on |
673 | the saved state from before the beginning of parsing the data that |
674 | matched this rule. |
675 | |
676 | The YYDEFGOTO table is output now. The detailed info is saved for |
677 | putting into YYTABLE later. |
678 `-------------------------------------------------------------------*/
679
680 static void
681 goto_actions (void)
682 {
683 int i;
684 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
685
686 state_count = XCALLOC (short, nstates);
687 for (i = ntokens; i < nsyms; ++i)
688 {
689 int default_state = default_goto (i);
690 save_column (i, default_state);
691 yydefgoto[i - ntokens] = default_state;
692 }
693
694 output_short_table (&format_obstack, yydefgoto,
695 yydefgoto[0], 1, nsyms - ntokens);
696 muscle_insert ("defgoto", obstack_finish (&format_obstack));
697
698 XFREE (state_count);
699 XFREE (yydefgoto);
700 }
701
702
703 /* The next few functions decide how to pack the actions and gotos
704 information into yytable. */
705
706 static void
707 sort_actions (void)
708 {
709 int i;
710
711 order = XCALLOC (short, nvectors);
712 nentries = 0;
713
714 for (i = 0; i < nvectors; i++)
715 if (tally[i] > 0)
716 {
717 int k;
718 int t = tally[i];
719 int w = width[i];
720 int j = nentries - 1;
721
722 while (j >= 0 && (width[order[j]] < w))
723 j--;
724
725 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
726 j--;
727
728 for (k = nentries - 1; k > j; k--)
729 order[k + 1] = order[k];
730
731 order[j + 1] = i;
732 nentries++;
733 }
734 }
735
736
737 static int
738 matching_state (int vector)
739 {
740 int i = order[vector];
741 int t;
742 int w;
743 int prev;
744
745 if (i >= (int) nstates)
746 return -1;
747
748 t = tally[i];
749 w = width[i];
750
751 for (prev = vector - 1; prev >= 0; prev--)
752 {
753 int j = order[prev];
754 int k;
755 int match = 1;
756
757 if (width[j] != w || tally[j] != t)
758 return -1;
759
760 for (k = 0; match && k < t; k++)
761 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
762 match = 0;
763
764 if (match)
765 return j;
766 }
767
768 return -1;
769 }
770
771 /* FIXME: For the time being, best approximation... */
772 #define MAXTABLE SHRT_MAX
773
774 static int
775 pack_vector (int vector)
776 {
777 int i = order[vector];
778 int j;
779 int t = tally[i];
780 int loc = 0;
781 short *from = froms[i];
782 short *to = tos[i];
783
784 assert (t);
785
786 for (j = lowzero - from[0]; j < MAXTABLE; j++)
787 {
788 int k;
789 int ok = 1;
790
791 for (k = 0; ok && k < t; k++)
792 {
793 loc = j + from[k];
794 if (loc > MAXTABLE)
795 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
796
797 if (table[loc] != 0)
798 ok = 0;
799 }
800
801 for (k = 0; ok && k < vector; k++)
802 if (pos[k] == j)
803 ok = 0;
804
805 if (ok)
806 {
807 for (k = 0; k < t; k++)
808 {
809 loc = j + from[k];
810 table[loc] = to[k];
811 check[loc] = from[k];
812 }
813
814 while (table[lowzero] != 0)
815 lowzero++;
816
817 if (loc > high)
818 high = loc;
819
820 return j;
821 }
822 }
823 #define pack_vector_succeeded 0
824 assert (pack_vector_succeeded);
825 return 0;
826 }
827
828
829 static void
830 pack_table (void)
831 {
832 int i;
833 int place;
834 int state;
835
836 base = XCALLOC (short, nvectors);
837 pos = XCALLOC (short, nentries);
838 table = XCALLOC (short, MAXTABLE);
839 check = XCALLOC (short, MAXTABLE);
840
841 lowzero = 0;
842 high = 0;
843
844 for (i = 0; i < nvectors; i++)
845 base[i] = SHRT_MIN;
846
847 for (i = 0; i < MAXTABLE; i++)
848 check[i] = -1;
849
850 for (i = 0; i < nentries; i++)
851 {
852 state = matching_state (i);
853
854 if (state < 0)
855 place = pack_vector (i);
856 else
857 place = base[state];
858
859 pos[i] = place;
860 base[order[i]] = place;
861 }
862
863 for (i = 0; i < nvectors; i++)
864 {
865 XFREE (froms[i]);
866 XFREE (tos[i]);
867 }
868
869 XFREE (froms);
870 XFREE (tos);
871 XFREE (pos);
872 }
873
874 /* the following functions output yytable, yycheck
875 and the vectors whose elements index the portion starts */
876
877 static void
878 output_base (void)
879 {
880 /* Output pact. */
881 output_short_table (&format_obstack, base,
882 base[0], 1, nstates);
883 muscle_insert ("pact", obstack_finish (&format_obstack));
884
885 /* Output pgoto. */
886 output_short_table (&format_obstack, base,
887 base[nstates], nstates + 1, nvectors);
888 muscle_insert ("pgoto", obstack_finish (&format_obstack));
889
890 XFREE (base);
891 }
892
893
894 static void
895 output_table (void)
896 {
897 output_short_table (&format_obstack, table,
898 table[0], 1, high + 1);
899 muscle_insert ("table", obstack_finish (&format_obstack));
900 XFREE (table);
901 }
902
903
904 static void
905 output_check (void)
906 {
907 output_short_table (&format_obstack, check,
908 check[0], 1, high + 1);
909 muscle_insert ("check", obstack_finish (&format_obstack));
910 XFREE (check);
911 }
912
913 /*-----------------------------------------------------------------.
914 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
915 | and yycheck. |
916 `-----------------------------------------------------------------*/
917
918 static void
919 output_actions (void)
920 {
921 size_t i;
922 nvectors = nstates + nvars;
923
924 froms = XCALLOC (short *, nvectors);
925 tos = XCALLOC (short *, nvectors);
926 tally = XCALLOC (short, nvectors);
927 width = XCALLOC (short, nvectors);
928
929 token_actions ();
930 bitsetv_free (LA);
931 free (LArule);
932
933 goto_actions ();
934 XFREE (goto_map + ntokens);
935 XFREE (from_state);
936 XFREE (to_state);
937
938 sort_actions ();
939 pack_table ();
940
941 output_base ();
942 output_table ();
943
944 output_check ();
945
946 for (i = 0; i < nstates; ++i)
947 {
948 free (states[i]->shifts);
949 XFREE (states[i]->reductions);
950 free (states[i]->errs);
951 free (states[i]);
952 }
953 XFREE (states);
954 }
955
956 \f
957 /*---------------------------.
958 | Call the skeleton parser. |
959 `---------------------------*/
960
961 static void
962 output_skeleton (void)
963 {
964 /* Store the definition of all the muscles. */
965 const char *tempdir = getenv ("TMPDIR");
966 char *tempfile = NULL;
967 FILE *out = NULL;
968 int fd;
969
970 if (tempdir == NULL)
971 tempdir = DEFAULT_TMPDIR;
972 tempfile = xmalloc (strlen (tempdir) + 11);
973 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
974 fd = mkstemp (tempfile);
975 if (fd == -1)
976 error (EXIT_FAILURE, errno, "%s", tempfile);
977
978 out = fdopen (fd, "w");
979 if (out == NULL)
980 error (EXIT_FAILURE, errno, "%s", tempfile);
981
982 /* There are no comments, especially not `#': we do want M4 expansion
983 after `#': think of CPP macros! */
984 fputs ("m4_changecom()\n", out);
985 fputs ("m4_init()\n", out);
986
987 fputs ("m4_define([b4_actions], \n[[", out);
988 actions_output (out);
989 fputs ("]])\n\n", out);
990
991 fputs ("m4_define([b4_guards], \n[[", out);
992 guards_output (out);
993 fputs ("]])\n\n", out);
994
995 fputs ("m4_define([b4_tokens], \n[", out);
996 token_definitions_output (out);
997 fputs ("])\n\n", out);
998
999 muscles_m4_output (out);
1000
1001 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1002 fputs ("m4_divert_push(0)dnl\n", out);
1003 xfclose (out);
1004
1005 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1006 {
1007 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1008 const char *m4 = getenv ("M4");
1009 if (!m4)
1010 m4 = M4;
1011 if (!bison_pkgdatadir)
1012 bison_pkgdatadir = PKGDATADIR;
1013 if (trace_flag)
1014 fprintf (stderr,
1015 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1016 m4, bison_pkgdatadir, tempfile, skeleton);
1017 skel_in = readpipe (m4,
1018 "-I", bison_pkgdatadir,
1019 "m4sugar/m4sugar.m4",
1020 tempfile,
1021 skeleton,
1022 NULL);
1023 if (!skel_in)
1024 error (EXIT_FAILURE, errno, "cannot run m4");
1025 skel_lex ();
1026
1027 /* If `debugging', keep this file alive. */
1028 if (!trace_flag)
1029 unlink (tempfile);
1030 }
1031 }
1032
1033 static void
1034 prepare (void)
1035 {
1036 MUSCLE_INSERT_INT ("last", high);
1037 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
1038 MUSCLE_INSERT_INT ("pure", pure_parser);
1039 MUSCLE_INSERT_INT ("nsym", nsyms);
1040 MUSCLE_INSERT_INT ("debug", debug_flag);
1041 MUSCLE_INSERT_INT ("final", final_state);
1042 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1043 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
1044 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1045 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1046
1047 /* FIXME: This is wrong: the muscles should decide whether they hold
1048 a copy or not, but the situation is too obscure currently. */
1049 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1050 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1051 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1052 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1053
1054 MUSCLE_INSERT_INT ("nnts", nvars);
1055 MUSCLE_INSERT_INT ("nrules", nrules);
1056 MUSCLE_INSERT_INT ("nstates", nstates);
1057 MUSCLE_INSERT_INT ("ntokens", ntokens);
1058
1059 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1060 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1061
1062 /* Copy definitions in directive. */
1063 obstack_1grow (&attrs_obstack, 0);
1064 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1065
1066 /* Find the right skeleton file. */
1067 if (!skeleton)
1068 {
1069 if (semantic_parser)
1070 skeleton = "bison.hairy";
1071 else
1072 skeleton = "bison.simple";
1073 }
1074
1075 /* Parse the skeleton file and output the needed parsers. */
1076 muscle_insert ("skeleton", skeleton);
1077 }
1078
1079
1080 /*----------------------------------------------------------.
1081 | Output the parsing tables and the parser code to ftable. |
1082 `----------------------------------------------------------*/
1083
1084 void
1085 output (void)
1086 {
1087 obstack_init (&format_obstack);
1088
1089 prepare_tokens ();
1090 prepare_rules ();
1091 prepare_states ();
1092 output_actions ();
1093
1094 prepare ();
1095
1096 /* Process the selected skeleton file. */
1097 output_skeleton ();
1098
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 }