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