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