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