]> git.saurik.com Git - bison.git/blob - src/output.c
5eddd1060d9e1065bb1a8fa1b63aa1bdfb95f18c
[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 unsigned int **conflict_tos = NULL;
119 static short *tally = NULL;
120 static short *width = NULL;
121 static short *actrow = NULL;
122 static short *conflrow = NULL;
123 static short *state_count = NULL;
124 static short *order = NULL;
125 static short *base = NULL;
126 static short *pos = NULL;
127
128 static unsigned int *conflict_table = NULL;
129 static unsigned int *conflict_list = NULL;
130 static int conflict_list_cnt;
131 static int conflict_list_free;
132
133 /* TABLE_SIZE is the allocated size of both TABLE and CHECK.
134 We start with the original hard-coded value: SHRT_MAX
135 (yes, not USHRT_MAX). */
136 static size_t table_size = SHRT_MAX;
137 static short *table = NULL;
138 static short *check = NULL;
139 static int lowzero;
140 static int high;
141
142 static struct obstack format_obstack;
143
144 int error_verbose = 0;
145
146
147 /*----------------------------------------------------------------.
148 | If TABLE (and CHECK) appear to be small to be addressed at |
149 | DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
150 | the desired size is at least DESIRED + 1. |
151 `----------------------------------------------------------------*/
152
153 static void
154 table_grow (size_t desired)
155 {
156 size_t old_size = table_size;
157
158 while (table_size <= desired)
159 table_size *= 2;
160
161 if (trace_flag)
162 fprintf (stderr, "growing table and check from: %d to %d\n",
163 old_size, table_size);
164
165 table = XREALLOC (table, short, table_size);
166 check = XREALLOC (check, short, table_size);
167 if (glr_parser)
168 conflict_table = XREALLOC (conflict_table, unsigned int, table_size);
169
170 for (/* Nothing. */; old_size < table_size; ++old_size)
171 {
172 table[old_size] = 0;
173 check[old_size] = -1;
174 }
175 }
176
177
178 /*-------------------------------------------------------------------.
179 | Create a function NAME which associates to the muscle NAME the |
180 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
181 | TYPE), and to the muscle NAME_max, the max value of the |
182 | TABLE_DATA. |
183 `-------------------------------------------------------------------*/
184
185
186 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
187 \
188 static void \
189 Name (const char *name, \
190 Type *table_data, \
191 Type first, \
192 int begin, \
193 int end) \
194 { \
195 Type max = first; \
196 int i; \
197 int j = 1; \
198 \
199 obstack_fgrow1 (&format_obstack, "%6d", first); \
200 for (i = begin; i < end; ++i) \
201 { \
202 obstack_1grow (&format_obstack, ','); \
203 if (j >= 10) \
204 { \
205 obstack_sgrow (&format_obstack, "\n "); \
206 j = 1; \
207 } \
208 else \
209 ++j; \
210 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
211 if (table_data[i] > max) \
212 max = table_data[i]; \
213 } \
214 obstack_1grow (&format_obstack, 0); \
215 muscle_insert (name, obstack_finish (&format_obstack)); \
216 \
217 /* Build `NAME_max' in the obstack. */ \
218 obstack_fgrow1 (&format_obstack, "%s_max", name); \
219 obstack_1grow (&format_obstack, 0); \
220 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
221 (long int) max); \
222 }
223
224 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
225 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
226 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number_t)
227 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
228 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number_t)
229
230
231 /*-----------------------------------------------------------------.
232 | Prepare the muscles related to the tokens: translate, tname, and |
233 | toknum. |
234 `-----------------------------------------------------------------*/
235
236 static void
237 prepare_tokens (void)
238 {
239 muscle_insert_symbol_number_table ("translate",
240 token_translations,
241 0, 1, max_user_token_number + 1);
242
243 {
244 int i;
245 int j = 0;
246 for (i = 0; i < nsyms; i++)
247 {
248 /* Be sure not to use twice the same QUOTEARG slot:
249 SYMBOL_TAG_GET uses slot 0. */
250 const char *cp =
251 quotearg_n_style (1, c_quoting_style,
252 symbols[i]->tag);
253 /* Width of the next token, including the two quotes, the coma
254 and the space. */
255 int strsize = strlen (cp) + 2;
256
257 if (j + strsize > 75)
258 {
259 obstack_sgrow (&format_obstack, "\n ");
260 j = 2;
261 }
262
263 obstack_sgrow (&format_obstack, cp);
264 obstack_sgrow (&format_obstack, ", ");
265 j += strsize;
266 }
267 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
268 defined). */
269 obstack_sgrow (&format_obstack, "0");
270
271 /* Finish table and store. */
272 obstack_1grow (&format_obstack, 0);
273 muscle_insert ("tname", obstack_finish (&format_obstack));
274 }
275
276 /* Output YYTOKNUM. */
277 {
278 int i;
279 short *values = XCALLOC (short, ntokens + 1);
280 for (i = 0; i < ntokens + 1; ++i)
281 values[i] = symbols[i]->user_token_number;
282 muscle_insert_short_table ("toknum", values,
283 0, 1, ntokens + 1);
284 free (values);
285 }
286 }
287
288
289 /*-------------------------------------------------------------.
290 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
291 | rline, dprec, merger |
292 `-------------------------------------------------------------*/
293
294 static void
295 prepare_rules (void)
296 {
297 rule_number_t r;
298 unsigned int i = 0;
299 item_number_t *rhs = XMALLOC (item_number_t, nritems);
300 unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
301 unsigned int *rline = XMALLOC (unsigned int, nrules + 1);
302 symbol_number_t *r1 = XMALLOC (symbol_number_t, nrules + 1);
303 unsigned int *r2 = XMALLOC (unsigned int, nrules + 1);
304 short *dprec = XMALLOC (short, nrules + 1);
305 short *merger = XMALLOC (short, nrules + 1);
306
307 for (r = 1; r < nrules + 1; ++r)
308 {
309 item_number_t *rhsp = NULL;
310 /* Index of rule R in RHS. */
311 prhs[r] = i;
312 /* RHS of the rule R. */
313 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
314 rhs[i++] = *rhsp;
315 /* LHS of the rule R. */
316 r1[r] = rules[r].lhs->number;
317 /* Length of rule R's RHS. */
318 r2[r] = i - prhs[r];
319 /* Separator in RHS. */
320 rhs[i++] = -1;
321 /* Line where rule was defined. */
322 rline[r] = rules[r].location.first_line;
323 /* Dynamic precedence (GLR) */
324 dprec[r] = rules[r].dprec;
325 /* Merger-function index (GLR) */
326 merger[r] = rules[r].merger;
327 }
328 assert (i == nritems);
329
330 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
331 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 1, nrules + 1);
332 muscle_insert_unsigned_int_table ("rline", rline, 0, 1, nrules + 1);
333 muscle_insert_symbol_number_table ("r1", r1, 0, 1, nrules + 1);
334 muscle_insert_unsigned_int_table ("r2", r2, 0, 1, nrules + 1);
335 muscle_insert_short_table ("dprec", dprec, 0, 1, nrules + 1);
336 muscle_insert_short_table ("merger", merger, 0, 1, nrules + 1);
337
338 free (rhs);
339 free (prhs);
340 free (rline);
341 free (r1);
342 free (r2);
343 free (dprec);
344 free (merger);
345 }
346
347 /*--------------------------------------------.
348 | Prepare the muscles related to the states. |
349 `--------------------------------------------*/
350
351 static void
352 prepare_states (void)
353 {
354 state_number_t i;
355 symbol_number_t *values =
356 (symbol_number_t *) alloca (sizeof (symbol_number_t) * nstates);
357 for (i = 0; i < nstates; ++i)
358 values[i] = states[i]->accessing_symbol;
359 muscle_insert_symbol_number_table ("stos", values,
360 0, 1, nstates);
361 }
362
363
364 /*-------------------------------------------------------------------.
365 | For GLR parsers, for each conflicted token in STATE, as indicated |
366 | by non-zero entries in conflrow, create a list of possible |
367 | reductions that are alternatives to the shift or reduction |
368 | currently recorded for that token in STATE. Store the alternative |
369 | reductions followed by a 0 in conflict_list, updating |
370 | conflict_list_cnt, and storing an index to the start of the list |
371 | back into conflrow. |
372 `-------------------------------------------------------------------*/
373
374 static void
375 conflict_row (state_t *state)
376 {
377 int i, j;
378
379 if (! glr_parser)
380 return;
381
382 for (j = 0; j < ntokens; j += 1)
383 if (conflrow[j])
384 {
385 conflrow[j] = conflict_list_cnt;
386
387 /* find all reductions for token j, and record all that do
388 * not match actrow[j] */
389 for (i = 0; i < state->nlookaheads; i += 1)
390 if (bitset_test (state->lookaheads[i], j)
391 && actrow[j] != -state->lookaheads_rule[i]->number)
392 {
393 assert (conflict_list_free > 0);
394 conflict_list[conflict_list_cnt]
395 = state->lookaheads_rule[i]->number;
396 conflict_list_cnt += 1;
397 conflict_list_free -= 1;
398 }
399
400 /* Leave a 0 at the end */
401 assert (conflict_list_free > 0);
402 conflict_list_cnt += 1;
403 conflict_list_free -= 1;
404 }
405 }
406
407
408 /*------------------------------------------------------------------.
409 | Decide what to do for each type of token if seen as the lookahead |
410 | token in specified state. The value returned is used as the |
411 | default action (yydefact) for the state. In addition, actrow is |
412 | filled with what to do for each kind of token, index by symbol |
413 | number, with zero meaning do the default action. The value |
414 | SHRT_MIN, a very negative number, means this situation is an |
415 | error. The parser recognizes this value specially. |
416 | |
417 | This is where conflicts are resolved. The loop over lookahead |
418 | rules considered lower-numbered rules last, and the last rule |
419 | considered that likes a token gets to handle it. |
420 | |
421 | For GLR parsers, also sets conflrow[SYM] to an index into |
422 | conflict_list iff there is an unresolved conflict (s/r or r/r) |
423 | with symbol SYM. The default reduction is not used for a symbol |
424 | that has any such conflicts. |
425 `------------------------------------------------------------------*/
426
427 static int
428 action_row (state_t *state)
429 {
430 int i;
431 rule_number_t default_rule = 0;
432 reductions_t *redp = state->reductions;
433 transitions_t *transitions = state->shifts;
434 errs_t *errp = state->errs;
435 /* set nonzero to inhibit having any default reduction */
436 int nodefault = 0;
437 int conflicted = 0;
438
439 for (i = 0; i < ntokens; i++)
440 actrow[i] = conflrow[i] = 0;
441
442 if (redp->num >= 1)
443 {
444 int j;
445 bitset_iterator biter;
446 /* loop over all the rules available here which require
447 lookahead */
448 for (i = state->nlookaheads - 1; i >= 0; --i)
449 /* and find each token which the rule finds acceptable
450 to come next */
451 BITSET_FOR_EACH (biter, state->lookaheads[i], j, 0)
452 {
453 /* and record this rule as the rule to use if that
454 token follows. */
455 if (actrow[j] != 0)
456 conflicted = conflrow[j] = 1;
457 actrow[j] = -state->lookaheads_rule[i]->number;
458 }
459 }
460
461 /* Now see which tokens are allowed for shifts in this state. For
462 them, record the shift as the thing to do. So shift is preferred
463 to reduce. */
464 for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
465 if (!TRANSITION_IS_DISABLED (transitions, i))
466 {
467 symbol_number_t symbol = TRANSITION_SYMBOL (transitions, i);
468 state_number_t shift_state = transitions->states[i];
469
470 if (actrow[symbol] != 0)
471 conflicted = conflrow[symbol] = 1;
472 actrow[symbol] = state_number_as_int (shift_state);
473
474 /* Do not use any default reduction if there is a shift for
475 error */
476 if (symbol == errtoken->number)
477 nodefault = 1;
478 }
479
480 /* See which tokens are an explicit error in this state (due to
481 %nonassoc). For them, record SHRT_MIN as the action. */
482 for (i = 0; i < errp->num; i++)
483 {
484 symbol_number_t symbol = errp->symbols[i];
485 actrow[symbol] = SHRT_MIN;
486 }
487
488 /* Now find the most common reduction and make it the default action
489 for this state. */
490
491 if (redp->num >= 1 && !nodefault)
492 {
493 if (state->consistent)
494 default_rule = redp->rules[0];
495 else
496 {
497 int max = 0;
498 for (i = 0; i < state->nlookaheads; i++)
499 {
500 int count = 0;
501 rule_number_t rule = state->lookaheads_rule[i]->number;
502 symbol_number_t j;
503
504 for (j = 0; j < ntokens; j++)
505 if (actrow[j] == -rule)
506 count++;
507
508 if (count > max)
509 {
510 max = count;
511 default_rule = rule;
512 }
513 }
514
515 /* GLR parsers need space for conflict lists, so we can't
516 default conflicted entries. For non-conflicted entries
517 or as long as we are not building a GLR parser,
518 actions that match the default are replaced with zero,
519 which means "use the default". */
520
521 if (max > 0)
522 {
523 int j;
524 for (j = 0; j < ntokens; j++)
525 if (actrow[j] == -default_rule
526 && ! (glr_parser && conflrow[j]))
527 actrow[j] = 0;
528 }
529 }
530 }
531
532 /* If have no default rule, the default is an error.
533 So replace any action which says "error" with "use default". */
534
535 if (default_rule == 0)
536 for (i = 0; i < ntokens; i++)
537 if (actrow[i] == SHRT_MIN)
538 actrow[i] = 0;
539
540 if (conflicted)
541 conflict_row (state);
542
543 return default_rule;
544 }
545
546
547 static void
548 save_row (state_number_t state)
549 {
550 symbol_number_t i;
551 int count;
552 short *sp = NULL;
553 short *sp1 = NULL;
554 short *sp2 = NULL;
555 unsigned int *sp3 = NULL;
556
557 count = 0;
558 for (i = 0; i < ntokens; i++)
559 if (actrow[i] != 0)
560 count++;
561
562 if (count == 0)
563 return;
564
565 froms[state] = sp1 = sp = XCALLOC (short, count);
566 tos[state] = sp2 = XCALLOC (short, count);
567 if (glr_parser)
568 conflict_tos[state] = sp3 = XCALLOC (unsigned int, count);
569 else
570 conflict_tos[state] = NULL;
571
572 for (i = 0; i < ntokens; i++)
573 if (actrow[i] != 0)
574 {
575 *sp1++ = i;
576 *sp2++ = actrow[i];
577 if (glr_parser)
578 *sp3++ = conflrow[i];
579 }
580
581 tally[state] = count;
582 width[state] = sp1[-1] - sp[0] + 1;
583 }
584
585
586 /*------------------------------------------------------------------.
587 | Figure out the actions for the specified state, indexed by |
588 | lookahead token type. |
589 | |
590 | The YYDEFACT table is output now. The detailed info is saved for |
591 | putting into YYTABLE later. |
592 `------------------------------------------------------------------*/
593
594 static void
595 token_actions (void)
596 {
597 state_number_t i;
598 int nconflict = conflicts_total_count ();
599
600 short *yydefact = XCALLOC (short, nstates);
601
602 actrow = XCALLOC (short, ntokens);
603
604 conflrow = XCALLOC (short, ntokens);
605 if (glr_parser)
606 {
607 conflict_list = XCALLOC (unsigned int, 1 + 2 * nconflict);
608 conflict_list_free = 2 * nconflict;
609 conflict_list_cnt = 1;
610 }
611 else
612 conflict_list_free = conflict_list_cnt = 0;
613
614 for (i = 0; i < nstates; ++i)
615 {
616 yydefact[i] = action_row (states[i]);
617 save_row (i);
618 }
619
620 muscle_insert_short_table ("defact", yydefact,
621 yydefact[0], 1, nstates);
622 XFREE (actrow);
623 XFREE (conflrow);
624 XFREE (yydefact);
625 }
626
627
628 /*-----------------------------.
629 | Output the actions to OOUT. |
630 `-----------------------------*/
631
632 void
633 actions_output (FILE *out)
634 {
635 rule_number_t r;
636
637 fputs ("m4_define([b4_actions], \n[[", out);
638 for (r = 1; r < nrules + 1; ++r)
639 if (rules[r].action)
640 {
641 fprintf (out, " case %d:\n", r);
642
643 if (!no_lines_flag)
644 fprintf (out, muscle_find ("linef"),
645 rules[r].action_location.first_line,
646 quotearg_style (c_quoting_style,
647 muscle_find ("filename")));
648 fprintf (out, " %s\n break;\n\n",
649 rules[r].action);
650 }
651 fputs ("]])\n\n", out);
652 }
653
654 /*--------------------------------------.
655 | Output the merge functions to OUT. |
656 `--------------------------------------*/
657
658 static void
659 merger_output (FILE *out)
660 {
661 int n;
662 merger_list* p;
663
664 fputs ("m4_define([b4_mergers], \n[[", out);
665 for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
666 {
667 if (p->type[0] == '\0')
668 fprintf (out, " case %d: yyval = %s (*yy0, *yy1); break;\n",
669 n, p->name);
670 else
671 fprintf (out, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
672 n, p->type, p->name);
673 }
674 fputs ("]])\n\n", out);
675 }
676
677 /*---------------------------------------.
678 | Output the tokens definition to OOUT. |
679 `---------------------------------------*/
680
681 void
682 token_definitions_output (FILE *out)
683 {
684 int i;
685 int first = 1;
686
687 fputs ("m4_define([b4_tokens], \n[", out);
688 for (i = 0; i < ntokens; ++i)
689 {
690 symbol_t *symbol = symbols[i];
691 int number = symbol->user_token_number;
692
693 /* At this stage, if there are literal aliases, they are part of
694 SYMBOLS, so we should not find symbols which are the aliases
695 here. */
696 assert (number != USER_NUMBER_ALIAS);
697
698 /* Skip error token. */
699 if (symbol == errtoken)
700 continue;
701
702 /* If this string has an alias, then it is necessarily the alias
703 which is to be output. */
704 if (symbol->alias)
705 symbol = symbol->alias;
706
707 /* Don't output literal chars or strings (when defined only as a
708 string). Note that must be done after the alias resolution:
709 think about `%token 'f' "f"'. */
710 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
711 continue;
712
713 /* Don't #define nonliteral tokens whose names contain periods
714 or '$' (as does the default value of the EOF token). */
715 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
716 continue;
717
718 fprintf (out, "%s[[[%s]], [%d]]",
719 first ? "" : ",\n", symbol->tag, number);
720
721 first = 0;
722 }
723 fputs ("])\n\n", out);
724 }
725
726
727 /*----------------------------------------.
728 | Output the symbol destructors to OOUT. |
729 `----------------------------------------*/
730
731 static void
732 symbol_destructors_output (FILE *out)
733 {
734 int i;
735 int first = 1;
736
737 fputs ("m4_define([b4_symbol_destructors], \n[", out);
738 for (i = 0; i < nsyms; ++i)
739 if (symbols[i]->destructor)
740 {
741 symbol_t *symbol = symbols[i];
742
743 /* Filename, lineno,
744 Symbol-name, Symbol-number,
745 destructor, typename. */
746 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
747 first ? "" : ",\n",
748 infile, symbol->destructor_location.first_line,
749 symbol->tag,
750 symbol->number,
751 symbol->destructor,
752 symbol->type_name);
753
754 first = 0;
755 }
756 fputs ("])\n\n", out);
757 }
758
759
760 /*-------------------------------------.
761 | Output the symbol printers to OOUT. |
762 `-------------------------------------*/
763
764 static void
765 symbol_printers_output (FILE *out)
766 {
767 int i;
768 int first = 1;
769
770 fputs ("m4_define([b4_symbol_printers], \n[", out);
771 for (i = 0; i < nsyms; ++i)
772 if (symbols[i]->destructor)
773 {
774 symbol_t *symbol = symbols[i];
775
776 /* Filename, lineno,
777 Symbol-name, Symbol-number,
778 destructor, typename. */
779 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
780 first ? "" : ",\n",
781 infile, symbol->printer_location.first_line,
782 symbol->tag,
783 symbol->number,
784 symbol->printer,
785 symbol->type_name);
786
787 first = 0;
788 }
789 fputs ("])\n\n", out);
790 }
791
792
793 static void
794 save_column (symbol_number_t symbol, state_number_t default_state)
795 {
796 int i;
797 short *sp;
798 short *sp1;
799 short *sp2;
800 int count;
801 int symno = symbol - ntokens + state_number_as_int (nstates);
802
803 int begin = goto_map[symbol];
804 int end = goto_map[symbol + 1];
805
806 count = 0;
807 for (i = begin; i < end; i++)
808 if (to_state[i] != default_state)
809 count++;
810
811 if (count == 0)
812 return;
813
814 froms[symno] = sp1 = sp = XCALLOC (short, count);
815 tos[symno] = sp2 = XCALLOC (short, count);
816
817 for (i = begin; i < end; i++)
818 if (to_state[i] != default_state)
819 {
820 *sp1++ = from_state[i];
821 *sp2++ = to_state[i];
822 }
823
824 tally[symno] = count;
825 width[symno] = sp1[-1] - sp[0] + 1;
826 }
827
828
829 static state_number_t
830 default_goto (symbol_number_t symbol)
831 {
832 state_number_t s;
833 int i;
834 int m = goto_map[symbol];
835 int n = goto_map[symbol + 1];
836 state_number_t default_state = (state_number_t) -1;
837 int max = 0;
838
839 if (m == n)
840 return (state_number_t) -1;
841
842 for (s = 0; s < nstates; s++)
843 state_count[s] = 0;
844
845 for (i = m; i < n; i++)
846 state_count[to_state[i]]++;
847
848 for (s = 0; s < nstates; s++)
849 if (state_count[s] > max)
850 {
851 max = state_count[s];
852 default_state = s;
853 }
854
855 return default_state;
856 }
857
858
859 /*-------------------------------------------------------------------.
860 | Figure out what to do after reducing with each rule, depending on |
861 | the saved state from before the beginning of parsing the data that |
862 | matched this rule. |
863 | |
864 | The YYDEFGOTO table is output now. The detailed info is saved for |
865 | putting into YYTABLE later. |
866 `-------------------------------------------------------------------*/
867
868 static void
869 goto_actions (void)
870 {
871 symbol_number_t i;
872 state_number_t *yydefgoto = XMALLOC (state_number_t, nsyms - ntokens);
873
874 state_count = XCALLOC (short, nstates);
875 for (i = ntokens; i < nsyms; ++i)
876 {
877 state_number_t default_state = default_goto (i);
878 save_column (i, default_state);
879 yydefgoto[i - ntokens] = default_state;
880 }
881
882 muscle_insert_state_number_table ("defgoto", yydefgoto,
883 yydefgoto[0], 1, nsyms - ntokens);
884 XFREE (state_count);
885 XFREE (yydefgoto);
886 }
887
888
889 /* The next few functions decide how to pack the actions and gotos
890 information into yytable. */
891
892 static void
893 sort_actions (void)
894 {
895 int i;
896
897 order = XCALLOC (short, nvectors);
898 nentries = 0;
899
900 for (i = 0; i < nvectors; i++)
901 if (tally[i] > 0)
902 {
903 int k;
904 int t = tally[i];
905 int w = width[i];
906 int j = nentries - 1;
907
908 while (j >= 0 && (width[order[j]] < w))
909 j--;
910
911 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
912 j--;
913
914 for (k = nentries - 1; k > j; k--)
915 order[k + 1] = order[k];
916
917 order[j + 1] = i;
918 nentries++;
919 }
920 }
921
922
923 static int
924 matching_state (int vector)
925 {
926 int i = order[vector];
927 int t;
928 int w;
929 int prev;
930
931 if (i >= (int) nstates)
932 return -1;
933
934 t = tally[i];
935 w = width[i];
936
937 for (prev = vector - 1; prev >= 0; prev--)
938 {
939 int j = order[prev];
940 int k;
941 int match = 1;
942
943 if (width[j] != w || tally[j] != t)
944 return -1;
945
946 for (k = 0; match && k < t; k++)
947 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
948 match = 0;
949
950 if (match)
951 return j;
952 }
953
954 return -1;
955 }
956
957
958 static int
959 pack_vector (int vector)
960 {
961 int i = order[vector];
962 int j;
963 int t = tally[i];
964 int loc = 0;
965 short *from = froms[i];
966 short *to = tos[i];
967 unsigned int *conflict_to = conflict_tos[i];
968
969 assert (t);
970
971 for (j = lowzero - from[0]; j < (int) table_size; j++)
972 {
973 int k;
974 int ok = 1;
975
976 for (k = 0; ok && k < t; k++)
977 {
978 loc = j + state_number_as_int (from[k]);
979 if (loc > (int) table_size)
980 table_grow (loc);
981
982 if (table[loc] != 0)
983 ok = 0;
984 }
985
986 for (k = 0; ok && k < vector; k++)
987 if (pos[k] == j)
988 ok = 0;
989
990 if (ok)
991 {
992 for (k = 0; k < t; k++)
993 {
994 loc = j + state_number_as_int (from[k]);
995 table[loc] = state_number_as_int (to[k]);
996 if (glr_parser && conflict_to != NULL)
997 conflict_table[loc] = conflict_to[k];
998 check[loc] = state_number_as_int (from[k]);
999 }
1000
1001 while (table[lowzero] != 0)
1002 lowzero++;
1003
1004 if (loc > high)
1005 high = loc;
1006
1007 return j;
1008 }
1009 }
1010 #define pack_vector_succeeded 0
1011 assert (pack_vector_succeeded);
1012 return 0;
1013 }
1014
1015
1016 static void
1017 pack_table (void)
1018 {
1019 int i;
1020 int place;
1021 int state;
1022
1023 base = XCALLOC (short, nvectors);
1024 pos = XCALLOC (short, nentries);
1025 table = XCALLOC (short, table_size);
1026 if (glr_parser)
1027 conflict_table = XCALLOC (unsigned int, table_size);
1028 check = XCALLOC (short, table_size);
1029
1030 lowzero = 0;
1031 high = 0;
1032
1033 for (i = 0; i < nvectors; i++)
1034 base[i] = SHRT_MIN;
1035
1036 for (i = 0; i < (int) table_size; i++)
1037 check[i] = -1;
1038
1039 for (i = 0; i < nentries; i++)
1040 {
1041 state = matching_state (i);
1042
1043 if (state < 0)
1044 place = pack_vector (i);
1045 else
1046 place = base[state];
1047
1048 pos[i] = place;
1049 base[order[i]] = place;
1050 }
1051
1052 for (i = 0; i < nvectors; i++)
1053 {
1054 XFREE (froms[i]);
1055 XFREE (tos[i]);
1056 XFREE (conflict_tos[i]);
1057 }
1058
1059 XFREE (froms);
1060 XFREE (tos);
1061 XFREE (conflict_tos);
1062 XFREE (pos);
1063 }
1064
1065 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1066 and the vectors whose elements index the portion starts */
1067
1068 static void
1069 output_base (void)
1070 {
1071 /* Output pact. */
1072 muscle_insert_short_table ("pact", base,
1073 base[0], 1, nstates);
1074
1075 /* Output pgoto. */
1076 muscle_insert_short_table ("pgoto", base,
1077 base[nstates], nstates + 1, nvectors);
1078 XFREE (base);
1079 }
1080
1081
1082 static void
1083 output_table (void)
1084 {
1085 muscle_insert_short_table ("table", table,
1086 table[0], 1, high + 1);
1087 XFREE (table);
1088 }
1089
1090
1091 static void
1092 output_conflicts (void)
1093 {
1094 /* GLR parsing slightly modifies yytable and yycheck
1095 (and thus yypact) so that in states with unresolved conflicts,
1096 the default reduction is not used in the conflicted entries, so
1097 that there is a place to put a conflict pointer. This means that
1098 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1099 avoid accidents by not writing them out in that case. */
1100 if (! glr_parser)
1101 return;
1102
1103 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
1104 conflict_table[0], 1, high+1);
1105 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
1106 conflict_list[0], 1, conflict_list_cnt);
1107
1108 XFREE (conflict_table);
1109 XFREE (conflict_list);
1110 }
1111
1112
1113 static void
1114 output_check (void)
1115 {
1116 muscle_insert_short_table ("check", check,
1117 check[0], 1, high + 1);
1118 XFREE (check);
1119 }
1120
1121 /*-----------------------------------------------------------------.
1122 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1123 | and yycheck. |
1124 `-----------------------------------------------------------------*/
1125
1126 static void
1127 output_actions (void)
1128 {
1129 /* That's a poor way to make sure the sizes are properly corelated,
1130 in particular the signedness is not taking into account, but it's
1131 not useless. */
1132 assert (sizeof (nvectors) >= sizeof (nstates));
1133 assert (sizeof (nvectors) >= sizeof (nvars));
1134
1135 nvectors = state_number_as_int (nstates) + nvars;
1136
1137 froms = XCALLOC (short *, nvectors);
1138 tos = XCALLOC (short *, nvectors);
1139 conflict_tos = XCALLOC (unsigned int *, nvectors);
1140 tally = XCALLOC (short, nvectors);
1141 width = XCALLOC (short, nvectors);
1142
1143 token_actions ();
1144 bitsetv_free (LA);
1145 free (LArule);
1146
1147 goto_actions ();
1148 XFREE (goto_map + ntokens);
1149 XFREE (from_state);
1150 XFREE (to_state);
1151
1152 sort_actions ();
1153 pack_table ();
1154
1155 output_base ();
1156 output_table ();
1157 output_conflicts ();
1158
1159 output_check ();
1160 }
1161
1162 \f
1163 /*----------------------.
1164 | Run our backend, M4. |
1165 `----------------------*/
1166
1167 static void
1168 m4_invoke (const char *definitions)
1169 {
1170 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1171 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1172 const char *m4 = getenv ("M4");
1173 int pkg_data_len;
1174 char *full_skeleton;
1175
1176 if (!m4)
1177 m4 = M4;
1178 if (!bison_pkgdatadir)
1179 bison_pkgdatadir = PKGDATADIR;
1180 pkg_data_len = strlen (bison_pkgdatadir);
1181 full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
1182 if (bison_pkgdatadir[pkg_data_len-1] == '/')
1183 sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
1184 else
1185 sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
1186 if (trace_flag)
1187 fprintf (stderr,
1188 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1189 m4, bison_pkgdatadir, definitions, full_skeleton);
1190 skel_in = readpipe (m4,
1191 "-I", bison_pkgdatadir,
1192 "m4sugar/m4sugar.m4",
1193 definitions,
1194 full_skeleton,
1195 NULL);
1196 XFREE (full_skeleton);
1197 if (!skel_in)
1198 error (EXIT_FAILURE, errno, "cannot run m4");
1199 skel_lex ();
1200 }
1201
1202
1203 /*---------------------------.
1204 | Call the skeleton parser. |
1205 `---------------------------*/
1206
1207 static void
1208 output_skeleton (void)
1209 {
1210 /* Store the definition of all the muscles. */
1211 const char *tempdir = getenv ("TMPDIR");
1212 char *tempfile = NULL;
1213 FILE *out = NULL;
1214 int fd;
1215
1216 if (tempdir == NULL)
1217 tempdir = DEFAULT_TMPDIR;
1218 tempfile = xmalloc (strlen (tempdir) + 11);
1219 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
1220 fd = mkstemp (tempfile);
1221 if (fd == -1)
1222 error (EXIT_FAILURE, errno, "%s", tempfile);
1223
1224 out = fdopen (fd, "w");
1225 if (out == NULL)
1226 error (EXIT_FAILURE, errno, "%s", tempfile);
1227
1228 /* There are no comments, especially not `#': we do want M4 expansion
1229 after `#': think of CPP macros! */
1230 fputs ("m4_changecom()\n", out);
1231 fputs ("m4_init()\n", out);
1232
1233 actions_output (out);
1234 merger_output (out);
1235 token_definitions_output (out);
1236 symbol_destructors_output (out);
1237 symbol_printers_output (out);
1238
1239 muscles_m4_output (out);
1240
1241 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1242 fputs ("m4_divert_push(0)dnl\n", out);
1243 xfclose (out);
1244
1245 m4_invoke (tempfile);
1246
1247 /* If `debugging', keep this file alive. */
1248 if (!trace_flag)
1249 unlink (tempfile);
1250
1251 free (tempfile);
1252 }
1253
1254 static void
1255 prepare (void)
1256 {
1257 MUSCLE_INSERT_INT ("last", high);
1258 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
1259 MUSCLE_INSERT_INT ("pure", pure_parser);
1260 MUSCLE_INSERT_INT ("nsym", nsyms);
1261 MUSCLE_INSERT_INT ("debug", debug_flag);
1262 MUSCLE_INSERT_INT ("final", final_state->number);
1263 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1264 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
1265 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1266 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1267
1268 /* FIXME: This is wrong: the muscles should decide whether they hold
1269 a copy or not, but the situation is too obscure currently. */
1270 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1271 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1272 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1273 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1274
1275 MUSCLE_INSERT_INT ("nnts", nvars);
1276 MUSCLE_INSERT_INT ("nrules", nrules);
1277 MUSCLE_INSERT_INT ("nstates", nstates);
1278 MUSCLE_INSERT_INT ("ntokens", ntokens);
1279
1280 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1281 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1282
1283 /* Copy definitions in directive. */
1284 obstack_1grow (&pre_prologue_obstack, 0);
1285 obstack_1grow (&post_prologue_obstack, 0);
1286 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1287 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
1288
1289 /* Find the right skeleton file. */
1290 if (!skeleton)
1291 {
1292 if (glr_parser)
1293 skeleton = "glr.c";
1294 else
1295 skeleton = "yacc.c";
1296 }
1297
1298 /* Parse the skeleton file and output the needed parsers. */
1299 muscle_insert ("skeleton", skeleton);
1300 }
1301
1302
1303 /*----------------------------------------------------------.
1304 | Output the parsing tables and the parser code to ftable. |
1305 `----------------------------------------------------------*/
1306
1307 void
1308 output (void)
1309 {
1310 obstack_init (&format_obstack);
1311
1312 prepare_tokens ();
1313 prepare_rules ();
1314 prepare_states ();
1315 output_actions ();
1316
1317 prepare ();
1318
1319 /* Process the selected skeleton file. */
1320 output_skeleton ();
1321
1322 obstack_free (&format_obstack, NULL);
1323 obstack_free (&pre_prologue_obstack, NULL);
1324 obstack_free (&post_prologue_obstack, NULL);
1325 }