]> git.saurik.com Git - bison.git/blame_incremental - src/output.c
* tests/calc.at (AT_CHECK_CALC): Adjust: there are now additional
[bison.git] / src / output.c
... / ...
CommitLineData
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. */
108FILE *readpipe PARAMS ((const char *, ...));
109
110/* From src/scan-skel.l. */
111int skel_lex PARAMS ((void));
112extern FILE *skel_in;
113
114static int nvectors;
115static int nentries;
116static short **froms = NULL;
117static short **tos = NULL;
118static short *tally = NULL;
119static short *width = NULL;
120static short *actrow = NULL;
121static short *state_count = NULL;
122static short *order = NULL;
123static short *base = NULL;
124static 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). */
129static size_t table_size = SHRT_MAX;
130static short *table = NULL;
131static short *check = NULL;
132static int lowzero;
133static int high;
134
135struct obstack muscle_obstack;
136static struct obstack format_obstack;
137
138int 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
147static void
148table_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 \
180static void \
181Name (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
216GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
217GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
218GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_token_number_table, token_number_t)
219GENERATE_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
227static void
228prepare_tokens (void)
229{
230 muscle_insert_token_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
285static void
286prepare_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 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 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_token_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
332static void
333prepare_states (void)
334{
335 size_t i;
336 token_number_t *values =
337 (token_number_t *) alloca (sizeof (token_number_t) * nstates);
338 for (i = 0; i < nstates; ++i)
339 values[i] = states[i]->accessing_symbol;
340 muscle_insert_token_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
359static int
360action_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 token_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
473static void
474save_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
513static void
514token_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
537void
538actions_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 /* As a Bison extension, add the ending semicolon. Since some
552 Yacc don't do that, help people using bison as a Yacc
553 finding their missing semicolons. */
554 fprintf (out, "{ %s%s }\n break;\n\n",
555 rules[rule].action,
556 yacc_flag ? ";" : "");
557 }
558}
559
560
561/*---------------------------------------.
562| Output the tokens definition to OOUT. |
563`---------------------------------------*/
564
565void
566token_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 /* At this stage, if there are literal aliases, they are part of
576 SYMBOLS, so we should not find symbols which are the aliases
577 here. */
578 assert (number != USER_NUMBER_ALIAS);
579
580 /* Skip error token. */
581 if (symbol == errtoken)
582 continue;
583
584 /* If this string has an alias, then it is necessarily the alias
585 which is to be output. */
586 if (symbol->alias)
587 symbol = symbol->alias;
588
589 /* Don't output literal chars or strings (when defined only as a
590 string). Note that must be done after the alias resolution:
591 think about `%token 'f' "f"'. */
592 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
593 continue;
594
595 /* Don't #define nonliteral tokens whose names contain periods
596 or '$' (as does the default value of the EOF token). */
597 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
598 continue;
599
600 fprintf (out, "%s[[[%s]], [%d]]",
601 first ? "" : ",\n", symbol->tag, number);
602
603 first = 0;
604 }
605}
606
607
608static void
609save_column (int symbol, int default_state)
610{
611 int i;
612 short *sp;
613 short *sp1;
614 short *sp2;
615 int count;
616 int symno = symbol - ntokens + nstates;
617
618 short begin = goto_map[symbol];
619 short end = goto_map[symbol + 1];
620
621 count = 0;
622 for (i = begin; i < end; i++)
623 if (to_state[i] != default_state)
624 count++;
625
626 if (count == 0)
627 return;
628
629 froms[symno] = sp1 = sp = XCALLOC (short, count);
630 tos[symno] = sp2 = XCALLOC (short, count);
631
632 for (i = begin; i < end; i++)
633 if (to_state[i] != default_state)
634 {
635 *sp1++ = from_state[i];
636 *sp2++ = to_state[i];
637 }
638
639 tally[symno] = count;
640 width[symno] = sp1[-1] - sp[0] + 1;
641}
642
643static int
644default_goto (int symbol)
645{
646 size_t i;
647 size_t m = goto_map[symbol];
648 size_t n = goto_map[symbol + 1];
649 int default_state = -1;
650 int max = 0;
651
652 if (m == n)
653 return -1;
654
655 for (i = 0; i < nstates; i++)
656 state_count[i] = 0;
657
658 for (i = m; i < n; i++)
659 state_count[to_state[i]]++;
660
661 for (i = 0; i < nstates; i++)
662 if (state_count[i] > max)
663 {
664 max = state_count[i];
665 default_state = i;
666 }
667
668 return default_state;
669}
670
671
672/*-------------------------------------------------------------------.
673| Figure out what to do after reducing with each rule, depending on |
674| the saved state from before the beginning of parsing the data that |
675| matched this rule. |
676| |
677| The YYDEFGOTO table is output now. The detailed info is saved for |
678| putting into YYTABLE later. |
679`-------------------------------------------------------------------*/
680
681static void
682goto_actions (void)
683{
684 int i;
685 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
686
687 state_count = XCALLOC (short, nstates);
688 for (i = ntokens; i < nsyms; ++i)
689 {
690 int default_state = default_goto (i);
691 save_column (i, default_state);
692 yydefgoto[i - ntokens] = default_state;
693 }
694
695 muscle_insert_short_table ("defgoto", yydefgoto,
696 yydefgoto[0], 1, nsyms - ntokens);
697 XFREE (state_count);
698 XFREE (yydefgoto);
699}
700
701
702/* The next few functions decide how to pack the actions and gotos
703 information into yytable. */
704
705static void
706sort_actions (void)
707{
708 int i;
709
710 order = XCALLOC (short, nvectors);
711 nentries = 0;
712
713 for (i = 0; i < nvectors; i++)
714 if (tally[i] > 0)
715 {
716 int k;
717 int t = tally[i];
718 int w = width[i];
719 int j = nentries - 1;
720
721 while (j >= 0 && (width[order[j]] < w))
722 j--;
723
724 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
725 j--;
726
727 for (k = nentries - 1; k > j; k--)
728 order[k + 1] = order[k];
729
730 order[j + 1] = i;
731 nentries++;
732 }
733}
734
735
736static int
737matching_state (int vector)
738{
739 int i = order[vector];
740 int t;
741 int w;
742 int prev;
743
744 if (i >= (int) nstates)
745 return -1;
746
747 t = tally[i];
748 w = width[i];
749
750 for (prev = vector - 1; prev >= 0; prev--)
751 {
752 int j = order[prev];
753 int k;
754 int match = 1;
755
756 if (width[j] != w || tally[j] != t)
757 return -1;
758
759 for (k = 0; match && k < t; k++)
760 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
761 match = 0;
762
763 if (match)
764 return j;
765 }
766
767 return -1;
768}
769
770
771static int
772pack_vector (int vector)
773{
774 int i = order[vector];
775 int j;
776 int t = tally[i];
777 int loc = 0;
778 short *from = froms[i];
779 short *to = tos[i];
780
781 assert (t);
782
783 for (j = lowzero - from[0]; j < (int) table_size; j++)
784 {
785 int k;
786 int ok = 1;
787
788 for (k = 0; ok && k < t; k++)
789 {
790 loc = j + from[k];
791 if (loc > (int) table_size)
792 table_grow (loc);
793
794 if (table[loc] != 0)
795 ok = 0;
796 }
797
798 for (k = 0; ok && k < vector; k++)
799 if (pos[k] == j)
800 ok = 0;
801
802 if (ok)
803 {
804 for (k = 0; k < t; k++)
805 {
806 loc = j + from[k];
807 table[loc] = to[k];
808 check[loc] = from[k];
809 }
810
811 while (table[lowzero] != 0)
812 lowzero++;
813
814 if (loc > high)
815 high = loc;
816
817 return j;
818 }
819 }
820#define pack_vector_succeeded 0
821 assert (pack_vector_succeeded);
822 return 0;
823}
824
825
826static void
827pack_table (void)
828{
829 int i;
830 int place;
831 int state;
832
833 base = XCALLOC (short, nvectors);
834 pos = XCALLOC (short, nentries);
835 table = XCALLOC (short, table_size);
836 check = XCALLOC (short, table_size);
837
838 lowzero = 0;
839 high = 0;
840
841 for (i = 0; i < nvectors; i++)
842 base[i] = SHRT_MIN;
843
844 for (i = 0; i < (int) table_size; i++)
845 check[i] = -1;
846
847 for (i = 0; i < nentries; i++)
848 {
849 state = matching_state (i);
850
851 if (state < 0)
852 place = pack_vector (i);
853 else
854 place = base[state];
855
856 pos[i] = place;
857 base[order[i]] = place;
858 }
859
860 for (i = 0; i < nvectors; i++)
861 {
862 XFREE (froms[i]);
863 XFREE (tos[i]);
864 }
865
866 XFREE (froms);
867 XFREE (tos);
868 XFREE (pos);
869}
870
871/* the following functions output yytable, yycheck
872 and the vectors whose elements index the portion starts */
873
874static void
875output_base (void)
876{
877 /* Output pact. */
878 muscle_insert_short_table ("pact", base,
879 base[0], 1, nstates);
880
881 /* Output pgoto. */
882 muscle_insert_short_table ("pgoto", base,
883 base[nstates], nstates + 1, nvectors);
884 XFREE (base);
885}
886
887
888static void
889output_table (void)
890{
891 muscle_insert_short_table ("table", table,
892 table[0], 1, high + 1);
893 XFREE (table);
894}
895
896
897static void
898output_check (void)
899{
900 muscle_insert_short_table ("check", check,
901 check[0], 1, high + 1);
902 XFREE (check);
903}
904
905/*-----------------------------------------------------------------.
906| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
907| and yycheck. |
908`-----------------------------------------------------------------*/
909
910static void
911output_actions (void)
912{
913 size_t i;
914 nvectors = nstates + nvars;
915
916 froms = XCALLOC (short *, nvectors);
917 tos = XCALLOC (short *, nvectors);
918 tally = XCALLOC (short, nvectors);
919 width = XCALLOC (short, nvectors);
920
921 token_actions ();
922 bitsetv_free (LA);
923 free (LArule);
924
925 goto_actions ();
926 XFREE (goto_map + ntokens);
927 XFREE (from_state);
928 XFREE (to_state);
929
930 sort_actions ();
931 pack_table ();
932
933 output_base ();
934 output_table ();
935
936 output_check ();
937
938 for (i = 0; i < nstates; ++i)
939 {
940 free (states[i]->shifts);
941 XFREE (states[i]->reductions);
942 free (states[i]->errs);
943 free (states[i]);
944 }
945 XFREE (states);
946}
947
948\f
949/*---------------------------.
950| Call the skeleton parser. |
951`---------------------------*/
952
953static void
954output_skeleton (void)
955{
956 /* Store the definition of all the muscles. */
957 const char *tempdir = getenv ("TMPDIR");
958 char *tempfile = NULL;
959 FILE *out = NULL;
960 int fd;
961
962 if (tempdir == NULL)
963 tempdir = DEFAULT_TMPDIR;
964 tempfile = xmalloc (strlen (tempdir) + 11);
965 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
966 fd = mkstemp (tempfile);
967 if (fd == -1)
968 error (EXIT_FAILURE, errno, "%s", tempfile);
969
970 out = fdopen (fd, "w");
971 if (out == NULL)
972 error (EXIT_FAILURE, errno, "%s", tempfile);
973
974 /* There are no comments, especially not `#': we do want M4 expansion
975 after `#': think of CPP macros! */
976 fputs ("m4_changecom()\n", out);
977 fputs ("m4_init()\n", out);
978
979 fputs ("m4_define([b4_actions], \n[[", out);
980 actions_output (out);
981 fputs ("]])\n\n", out);
982
983 fputs ("m4_define([b4_tokens], \n[", out);
984 token_definitions_output (out);
985 fputs ("])\n\n", out);
986
987 muscles_m4_output (out);
988
989 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
990 fputs ("m4_divert_push(0)dnl\n", out);
991 xfclose (out);
992
993 /* Invoke m4 on the definition of the muscles, and the skeleton. */
994 {
995 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
996 const char *m4 = getenv ("M4");
997 if (!m4)
998 m4 = M4;
999 if (!bison_pkgdatadir)
1000 bison_pkgdatadir = PKGDATADIR;
1001 if (trace_flag)
1002 fprintf (stderr,
1003 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1004 m4, bison_pkgdatadir, tempfile, skeleton);
1005 skel_in = readpipe (m4,
1006 "-I", bison_pkgdatadir,
1007 "m4sugar/m4sugar.m4",
1008 tempfile,
1009 skeleton,
1010 NULL);
1011 if (!skel_in)
1012 error (EXIT_FAILURE, errno, "cannot run m4");
1013 skel_lex ();
1014
1015 /* If `debugging', keep this file alive. */
1016 if (!trace_flag)
1017 unlink (tempfile);
1018 }
1019}
1020
1021static void
1022prepare (void)
1023{
1024 MUSCLE_INSERT_INT ("last", high);
1025 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
1026 MUSCLE_INSERT_INT ("pure", pure_parser);
1027 MUSCLE_INSERT_INT ("nsym", nsyms);
1028 MUSCLE_INSERT_INT ("debug", debug_flag);
1029 MUSCLE_INSERT_INT ("final", final_state);
1030 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1031 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
1032 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1033 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1034
1035 /* FIXME: This is wrong: the muscles should decide whether they hold
1036 a copy or not, but the situation is too obscure currently. */
1037 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1038 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1039 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1040 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1041
1042 MUSCLE_INSERT_INT ("nnts", nvars);
1043 MUSCLE_INSERT_INT ("nrules", nrules);
1044 MUSCLE_INSERT_INT ("nstates", nstates);
1045 MUSCLE_INSERT_INT ("ntokens", ntokens);
1046
1047 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1048 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1049
1050 /* Copy definitions in directive. */
1051 obstack_1grow (&pre_prologue_obstack, 0);
1052 obstack_1grow (&post_prologue_obstack, 0);
1053 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1054 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
1055
1056 /* Find the right skeleton file. */
1057 if (!skeleton)
1058 skeleton = "bison.simple";
1059
1060 /* Parse the skeleton file and output the needed parsers. */
1061 muscle_insert ("skeleton", skeleton);
1062}
1063
1064
1065/*----------------------------------------------------------.
1066| Output the parsing tables and the parser code to ftable. |
1067`----------------------------------------------------------*/
1068
1069void
1070output (void)
1071{
1072 obstack_init (&format_obstack);
1073
1074 prepare_tokens ();
1075 prepare_rules ();
1076 prepare_states ();
1077 output_actions ();
1078
1079 prepare ();
1080
1081 /* Process the selected skeleton file. */
1082 output_skeleton ();
1083
1084 obstack_free (&muscle_obstack, NULL);
1085 obstack_free (&format_obstack, NULL);
1086 obstack_free (&action_obstack, NULL);
1087 obstack_free (&pre_prologue_obstack, NULL);
1088 obstack_free (&post_prologue_obstack, NULL);
1089}