]> git.saurik.com Git - bison.git/blame_incremental - src/output.c
* tests/calc.at: Exercise prologue splitting.
[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 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 \
179static inline long int \
180Name (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
210GENERATE_OUTPUT_TABLE(output_int_table, int)
211GENERATE_OUTPUT_TABLE(output_short_table, short)
212GENERATE_OUTPUT_TABLE(output_token_number_table, token_number_t)
213GENERATE_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
221static void
222prepare_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
283static void
284prepare_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
339static void
340prepare_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
367static int
368action_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
481static void
482save_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
521static void
522token_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
547void
548actions_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 guards to OOUT. |
573`----------------------------*/
574
575void
576guards_output (FILE *out)
577{
578 int rule;
579 for (rule = 1; rule < nrules + 1; ++rule)
580 if (rules[rule].guard)
581 {
582 fprintf (out, " case %d:\n", rule);
583
584 if (!no_lines_flag)
585 fprintf (out, muscle_find ("linef"),
586 rules[rule].guard_line,
587 quotearg_style (c_quoting_style,
588 muscle_find ("filename")));
589 fprintf (out, "{ %s; }\n break;\n\n",
590 rules[rule].guard);
591 }
592}
593
594
595/*---------------------------------------.
596| Output the tokens definition to OOUT. |
597`---------------------------------------*/
598
599void
600token_definitions_output (FILE *out)
601{
602 int i;
603 int first = 1;
604 for (i = 0; i < ntokens; ++i)
605 {
606 symbol_t *symbol = symbols[i];
607 int number = symbol->user_token_number;
608
609 if (number == SALIAS)
610 continue;
611 /* Skip error token. */
612 if (symbol == errtoken)
613 continue;
614 if (symbol->tag[0] == '\'')
615 continue; /* skip literal character */
616 if (symbol->tag[0] == '\"')
617 {
618 /* use literal string only if given a symbol with an alias */
619 if (symbol->alias)
620 symbol = symbol->alias;
621 else
622 continue;
623 }
624
625 /* Don't #define nonliteral tokens whose names contain periods
626 or '$' (as does the default value of the EOF token). */
627 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
628 continue;
629
630 fprintf (out, "%s [[[%s]], [%d]]",
631 first ? "" : ",\n", symbol->tag, number);
632 if (semantic_parser)
633 /* FIXME: This is probably wrong, and should be just as
634 above. --akim. */
635 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->number);
636 first = 0;
637 }
638}
639
640
641static void
642save_column (int symbol, int default_state)
643{
644 int i;
645 short *sp;
646 short *sp1;
647 short *sp2;
648 int count;
649 int symno = symbol - ntokens + nstates;
650
651 short begin = goto_map[symbol];
652 short end = goto_map[symbol + 1];
653
654 count = 0;
655 for (i = begin; i < end; i++)
656 if (to_state[i] != default_state)
657 count++;
658
659 if (count == 0)
660 return;
661
662 froms[symno] = sp1 = sp = XCALLOC (short, count);
663 tos[symno] = sp2 = XCALLOC (short, count);
664
665 for (i = begin; i < end; i++)
666 if (to_state[i] != default_state)
667 {
668 *sp1++ = from_state[i];
669 *sp2++ = to_state[i];
670 }
671
672 tally[symno] = count;
673 width[symno] = sp1[-1] - sp[0] + 1;
674}
675
676static int
677default_goto (int symbol)
678{
679 size_t i;
680 size_t m = goto_map[symbol];
681 size_t n = goto_map[symbol + 1];
682 int default_state = -1;
683 int max = 0;
684
685 if (m == n)
686 return -1;
687
688 for (i = 0; i < nstates; i++)
689 state_count[i] = 0;
690
691 for (i = m; i < n; i++)
692 state_count[to_state[i]]++;
693
694 for (i = 0; i < nstates; i++)
695 if (state_count[i] > max)
696 {
697 max = state_count[i];
698 default_state = i;
699 }
700
701 return default_state;
702}
703
704
705/*-------------------------------------------------------------------.
706| Figure out what to do after reducing with each rule, depending on |
707| the saved state from before the beginning of parsing the data that |
708| matched this rule. |
709| |
710| The YYDEFGOTO table is output now. The detailed info is saved for |
711| putting into YYTABLE later. |
712`-------------------------------------------------------------------*/
713
714static void
715goto_actions (void)
716{
717 int i;
718 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
719
720 state_count = XCALLOC (short, nstates);
721 for (i = ntokens; i < nsyms; ++i)
722 {
723 int default_state = default_goto (i);
724 save_column (i, default_state);
725 yydefgoto[i - ntokens] = default_state;
726 }
727
728 output_short_table (&format_obstack, yydefgoto,
729 yydefgoto[0], 1, nsyms - ntokens);
730 muscle_insert ("defgoto", obstack_finish (&format_obstack));
731
732 XFREE (state_count);
733 XFREE (yydefgoto);
734}
735
736
737/* The next few functions decide how to pack the actions and gotos
738 information into yytable. */
739
740static void
741sort_actions (void)
742{
743 int i;
744
745 order = XCALLOC (short, nvectors);
746 nentries = 0;
747
748 for (i = 0; i < nvectors; i++)
749 if (tally[i] > 0)
750 {
751 int k;
752 int t = tally[i];
753 int w = width[i];
754 int j = nentries - 1;
755
756 while (j >= 0 && (width[order[j]] < w))
757 j--;
758
759 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
760 j--;
761
762 for (k = nentries - 1; k > j; k--)
763 order[k + 1] = order[k];
764
765 order[j + 1] = i;
766 nentries++;
767 }
768}
769
770
771static int
772matching_state (int vector)
773{
774 int i = order[vector];
775 int t;
776 int w;
777 int prev;
778
779 if (i >= (int) nstates)
780 return -1;
781
782 t = tally[i];
783 w = width[i];
784
785 for (prev = vector - 1; prev >= 0; prev--)
786 {
787 int j = order[prev];
788 int k;
789 int match = 1;
790
791 if (width[j] != w || tally[j] != t)
792 return -1;
793
794 for (k = 0; match && k < t; k++)
795 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
796 match = 0;
797
798 if (match)
799 return j;
800 }
801
802 return -1;
803}
804
805
806static int
807pack_vector (int vector)
808{
809 int i = order[vector];
810 int j;
811 int t = tally[i];
812 int loc = 0;
813 short *from = froms[i];
814 short *to = tos[i];
815
816 assert (t);
817
818 for (j = lowzero - from[0]; j < (int) table_size; j++)
819 {
820 int k;
821 int ok = 1;
822
823 for (k = 0; ok && k < t; k++)
824 {
825 loc = j + from[k];
826 if (loc > (int) table_size)
827 table_grow (loc);
828
829 if (table[loc] != 0)
830 ok = 0;
831 }
832
833 for (k = 0; ok && k < vector; k++)
834 if (pos[k] == j)
835 ok = 0;
836
837 if (ok)
838 {
839 for (k = 0; k < t; k++)
840 {
841 loc = j + from[k];
842 table[loc] = to[k];
843 check[loc] = from[k];
844 }
845
846 while (table[lowzero] != 0)
847 lowzero++;
848
849 if (loc > high)
850 high = loc;
851
852 return j;
853 }
854 }
855#define pack_vector_succeeded 0
856 assert (pack_vector_succeeded);
857 return 0;
858}
859
860
861static void
862pack_table (void)
863{
864 int i;
865 int place;
866 int state;
867
868 base = XCALLOC (short, nvectors);
869 pos = XCALLOC (short, nentries);
870 table = XCALLOC (short, table_size);
871 check = XCALLOC (short, table_size);
872
873 lowzero = 0;
874 high = 0;
875
876 for (i = 0; i < nvectors; i++)
877 base[i] = SHRT_MIN;
878
879 for (i = 0; i < (int) table_size; i++)
880 check[i] = -1;
881
882 for (i = 0; i < nentries; i++)
883 {
884 state = matching_state (i);
885
886 if (state < 0)
887 place = pack_vector (i);
888 else
889 place = base[state];
890
891 pos[i] = place;
892 base[order[i]] = place;
893 }
894
895 for (i = 0; i < nvectors; i++)
896 {
897 XFREE (froms[i]);
898 XFREE (tos[i]);
899 }
900
901 XFREE (froms);
902 XFREE (tos);
903 XFREE (pos);
904}
905
906/* the following functions output yytable, yycheck
907 and the vectors whose elements index the portion starts */
908
909static void
910output_base (void)
911{
912 /* Output pact. */
913 output_short_table (&format_obstack, base,
914 base[0], 1, nstates);
915 muscle_insert ("pact", obstack_finish (&format_obstack));
916
917 /* Output pgoto. */
918 output_short_table (&format_obstack, base,
919 base[nstates], nstates + 1, nvectors);
920 muscle_insert ("pgoto", obstack_finish (&format_obstack));
921
922 XFREE (base);
923}
924
925
926static void
927output_table (void)
928{
929 output_short_table (&format_obstack, table,
930 table[0], 1, high + 1);
931 muscle_insert ("table", obstack_finish (&format_obstack));
932 XFREE (table);
933}
934
935
936static void
937output_check (void)
938{
939 output_short_table (&format_obstack, check,
940 check[0], 1, high + 1);
941 muscle_insert ("check", obstack_finish (&format_obstack));
942 XFREE (check);
943}
944
945/*-----------------------------------------------------------------.
946| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
947| and yycheck. |
948`-----------------------------------------------------------------*/
949
950static void
951output_actions (void)
952{
953 size_t i;
954 nvectors = nstates + nvars;
955
956 froms = XCALLOC (short *, nvectors);
957 tos = XCALLOC (short *, nvectors);
958 tally = XCALLOC (short, nvectors);
959 width = XCALLOC (short, nvectors);
960
961 token_actions ();
962 bitsetv_free (LA);
963 free (LArule);
964
965 goto_actions ();
966 XFREE (goto_map + ntokens);
967 XFREE (from_state);
968 XFREE (to_state);
969
970 sort_actions ();
971 pack_table ();
972
973 output_base ();
974 output_table ();
975
976 output_check ();
977
978 for (i = 0; i < nstates; ++i)
979 {
980 free (states[i]->shifts);
981 XFREE (states[i]->reductions);
982 free (states[i]->errs);
983 free (states[i]);
984 }
985 XFREE (states);
986}
987
988\f
989/*---------------------------.
990| Call the skeleton parser. |
991`---------------------------*/
992
993static void
994output_skeleton (void)
995{
996 /* Store the definition of all the muscles. */
997 const char *tempdir = getenv ("TMPDIR");
998 char *tempfile = NULL;
999 FILE *out = NULL;
1000 int fd;
1001
1002 if (tempdir == NULL)
1003 tempdir = DEFAULT_TMPDIR;
1004 tempfile = xmalloc (strlen (tempdir) + 11);
1005 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
1006 fd = mkstemp (tempfile);
1007 if (fd == -1)
1008 error (EXIT_FAILURE, errno, "%s", tempfile);
1009
1010 out = fdopen (fd, "w");
1011 if (out == NULL)
1012 error (EXIT_FAILURE, errno, "%s", tempfile);
1013
1014 /* There are no comments, especially not `#': we do want M4 expansion
1015 after `#': think of CPP macros! */
1016 fputs ("m4_changecom()\n", out);
1017 fputs ("m4_init()\n", out);
1018
1019 fputs ("m4_define([b4_actions], \n[[", out);
1020 actions_output (out);
1021 fputs ("]])\n\n", out);
1022
1023 fputs ("m4_define([b4_guards], \n[[", out);
1024 guards_output (out);
1025 fputs ("]])\n\n", out);
1026
1027 fputs ("m4_define([b4_tokens], \n[", out);
1028 token_definitions_output (out);
1029 fputs ("])\n\n", out);
1030
1031 muscles_m4_output (out);
1032
1033 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1034 fputs ("m4_divert_push(0)dnl\n", out);
1035 xfclose (out);
1036
1037 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1038 {
1039 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1040 const char *m4 = getenv ("M4");
1041 if (!m4)
1042 m4 = M4;
1043 if (!bison_pkgdatadir)
1044 bison_pkgdatadir = PKGDATADIR;
1045 if (trace_flag)
1046 fprintf (stderr,
1047 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1048 m4, bison_pkgdatadir, tempfile, skeleton);
1049 skel_in = readpipe (m4,
1050 "-I", bison_pkgdatadir,
1051 "m4sugar/m4sugar.m4",
1052 tempfile,
1053 skeleton,
1054 NULL);
1055 if (!skel_in)
1056 error (EXIT_FAILURE, errno, "cannot run m4");
1057 skel_lex ();
1058
1059 /* If `debugging', keep this file alive. */
1060 if (!trace_flag)
1061 unlink (tempfile);
1062 }
1063}
1064
1065static void
1066prepare (void)
1067{
1068 MUSCLE_INSERT_INT ("last", high);
1069 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
1070 MUSCLE_INSERT_INT ("pure", pure_parser);
1071 MUSCLE_INSERT_INT ("nsym", nsyms);
1072 MUSCLE_INSERT_INT ("debug", debug_flag);
1073 MUSCLE_INSERT_INT ("final", final_state);
1074 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1075 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
1076 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1077 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1078
1079 /* FIXME: This is wrong: the muscles should decide whether they hold
1080 a copy or not, but the situation is too obscure currently. */
1081 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1082 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1083 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1084 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1085
1086 MUSCLE_INSERT_INT ("nnts", nvars);
1087 MUSCLE_INSERT_INT ("nrules", nrules);
1088 MUSCLE_INSERT_INT ("nstates", nstates);
1089 MUSCLE_INSERT_INT ("ntokens", ntokens);
1090
1091 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1092 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1093
1094 /* Copy definitions in directive. */
1095 obstack_1grow (&pre_prologue_obstack, 0);
1096 obstack_1grow (&post_prologue_obstack, 0);
1097 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1098 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
1099
1100 /* Find the right skeleton file. */
1101 if (!skeleton)
1102 {
1103 if (semantic_parser)
1104 skeleton = "bison.hairy";
1105 else
1106 skeleton = "bison.simple";
1107 }
1108
1109 /* Parse the skeleton file and output the needed parsers. */
1110 muscle_insert ("skeleton", skeleton);
1111}
1112
1113
1114/*----------------------------------------------------------.
1115| Output the parsing tables and the parser code to ftable. |
1116`----------------------------------------------------------*/
1117
1118void
1119output (void)
1120{
1121 obstack_init (&format_obstack);
1122
1123 prepare_tokens ();
1124 prepare_rules ();
1125 prepare_states ();
1126 output_actions ();
1127
1128 prepare ();
1129
1130 /* Process the selected skeleton file. */
1131 output_skeleton ();
1132
1133 obstack_free (&muscle_obstack, NULL);
1134 obstack_free (&format_obstack, NULL);
1135 obstack_free (&action_obstack, NULL);
1136 obstack_free (&pre_prologue_obstack, NULL);
1137 obstack_free (&post_prologue_obstack, NULL);
1138}