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