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