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