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