]> git.saurik.com Git - bison.git/blob - src/output.c
6de36ae22041230cc3254167f18419a43822b7ec
[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 symbol_tag_get (symbols[i]));
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 /* loop over all the rules available here which require
446 lookahead */
447 for (i = state->nlookaheads - 1; i >= 0; --i)
448 /* and find each token which the rule finds acceptable
449 to come next */
450 BITSET_EXECUTE (state->lookaheads[i], 0, j,
451 {
452 /* and record this rule as the rule to use if that
453 token follows. */
454 if (actrow[j] != 0)
455 conflicted = conflrow[j] = 1;
456 actrow[j] = -state->lookaheads_rule[i]->number;
457 });
458 }
459
460 /* Now see which tokens are allowed for shifts in this state. For
461 them, record the shift as the thing to do. So shift is preferred
462 to reduce. */
463 for (i = 0; i < transitions->num && TRANSITION_IS_SHIFT (transitions, i); i++)
464 if (!TRANSITION_IS_DISABLED (transitions, i))
465 {
466 symbol_number_t symbol = TRANSITION_SYMBOL (transitions, i);
467 state_number_t shift_state = transitions->states[i];
468
469 if (actrow[symbol] != 0)
470 conflicted = conflrow[symbol] = 1;
471 actrow[symbol] = state_number_as_int (shift_state);
472
473 /* Do not use any default reduction if there is a shift for
474 error */
475 if (symbol == errtoken->number)
476 nodefault = 1;
477 }
478
479 /* See which tokens are an explicit error in this state (due to
480 %nonassoc). For them, record SHRT_MIN as the action. */
481 for (i = 0; i < errp->num; i++)
482 {
483 symbol_number_t symbol = errp->symbols[i];
484 actrow[symbol] = SHRT_MIN;
485 }
486
487 /* Now find the most common reduction and make it the default action
488 for this state. */
489
490 if (redp->num >= 1 && !nodefault)
491 {
492 if (state->consistent)
493 default_rule = redp->rules[0];
494 else
495 {
496 int max = 0;
497 for (i = 0; i < state->nlookaheads; i++)
498 {
499 int count = 0;
500 rule_number_t rule = state->lookaheads_rule[i]->number;
501 symbol_number_t j;
502
503 for (j = 0; j < ntokens; j++)
504 if (actrow[j] == -rule)
505 count++;
506
507 if (count > max)
508 {
509 max = count;
510 default_rule = rule;
511 }
512 }
513
514 /* GLR parsers need space for conflict lists, so we can't
515 default conflicted entries. For non-conflicted entries
516 or as long as we are not building a GLR parser,
517 actions that match the default are replaced with zero,
518 which means "use the default". */
519
520 if (max > 0)
521 {
522 int j;
523 for (j = 0; j < ntokens; j++)
524 if (actrow[j] == -default_rule
525 && ! (glr_parser && conflrow[j]))
526 actrow[j] = 0;
527 }
528 }
529 }
530
531 /* If have no default rule, the default is an error.
532 So replace any action which says "error" with "use default". */
533
534 if (default_rule == 0)
535 for (i = 0; i < ntokens; i++)
536 if (actrow[i] == SHRT_MIN)
537 actrow[i] = 0;
538
539 if (conflicted)
540 conflict_row (state);
541
542 return default_rule;
543 }
544
545
546 static void
547 save_row (state_number_t state)
548 {
549 symbol_number_t i;
550 int count;
551 short *sp = NULL;
552 short *sp1 = NULL;
553 short *sp2 = NULL;
554 unsigned int *sp3 = NULL;
555
556 count = 0;
557 for (i = 0; i < ntokens; i++)
558 if (actrow[i] != 0)
559 count++;
560
561 if (count == 0)
562 return;
563
564 froms[state] = sp1 = sp = XCALLOC (short, count);
565 tos[state] = sp2 = XCALLOC (short, count);
566 if (glr_parser)
567 conflict_tos[state] = sp3 = XCALLOC (unsigned int, count);
568 else
569 conflict_tos[state] = NULL;
570
571 for (i = 0; i < ntokens; i++)
572 if (actrow[i] != 0)
573 {
574 *sp1++ = i;
575 *sp2++ = actrow[i];
576 if (glr_parser)
577 *sp3++ = conflrow[i];
578 }
579
580 tally[state] = count;
581 width[state] = sp1[-1] - sp[0] + 1;
582 }
583
584
585 /*------------------------------------------------------------------.
586 | Figure out the actions for the specified state, indexed by |
587 | lookahead token type. |
588 | |
589 | The YYDEFACT table is output now. The detailed info is saved for |
590 | putting into YYTABLE later. |
591 `------------------------------------------------------------------*/
592
593 static void
594 token_actions (void)
595 {
596 state_number_t i;
597 int nconflict = conflicts_total_count ();
598
599 short *yydefact = XCALLOC (short, nstates);
600
601 actrow = XCALLOC (short, ntokens);
602
603 conflrow = XCALLOC (short, ntokens);
604 if (glr_parser)
605 {
606 conflict_list = XCALLOC (unsigned int, 1 + 2 * nconflict);
607 conflict_list_free = 2 * nconflict;
608 conflict_list_cnt = 1;
609 }
610 else
611 conflict_list_free = conflict_list_cnt = 0;
612
613 for (i = 0; i < nstates; ++i)
614 {
615 yydefact[i] = action_row (states[i]);
616 save_row (i);
617 }
618
619 muscle_insert_short_table ("defact", yydefact,
620 yydefact[0], 1, nstates);
621 XFREE (actrow);
622 XFREE (conflrow);
623 XFREE (yydefact);
624 }
625
626
627 /*-----------------------------.
628 | Output the actions to OOUT. |
629 `-----------------------------*/
630
631 void
632 actions_output (FILE *out)
633 {
634 rule_number_t r;
635
636 fputs ("m4_define([b4_actions], \n[[", out);
637 for (r = 1; r < nrules + 1; ++r)
638 if (rules[r].action)
639 {
640 fprintf (out, " case %d:\n", r);
641
642 if (!no_lines_flag)
643 fprintf (out, muscle_find ("linef"),
644 rules[r].action_location.first_line,
645 quotearg_style (c_quoting_style,
646 muscle_find ("filename")));
647 fprintf (out, " %s\n break;\n\n",
648 rules[r].action);
649 }
650 fputs ("]])\n\n", out);
651 }
652
653 /*--------------------------------------.
654 | Output the merge functions to OUT. |
655 `--------------------------------------*/
656
657 static void
658 merger_output (FILE *out)
659 {
660 int n;
661 merger_list* p;
662
663 fputs ("m4_define([b4_mergers], \n[[", out);
664 for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
665 {
666 if (p->type[0] == '\0')
667 fprintf (out, " case %d: yyval = %s (*yy0, *yy1); break;\n",
668 n, p->name);
669 else
670 fprintf (out, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
671 n, p->type, p->name);
672 }
673 fputs ("]])\n\n", out);
674 }
675
676 /*---------------------------------------.
677 | Output the tokens definition to OOUT. |
678 `---------------------------------------*/
679
680 void
681 token_definitions_output (FILE *out)
682 {
683 int i;
684 int first = 1;
685
686 fputs ("m4_define([b4_tokens], \n[", out);
687 for (i = 0; i < ntokens; ++i)
688 {
689 symbol_t *symbol = symbols[i];
690 int number = symbol->user_token_number;
691
692 /* At this stage, if there are literal aliases, they are part of
693 SYMBOLS, so we should not find symbols which are the aliases
694 here. */
695 assert (number != USER_NUMBER_ALIAS);
696
697 /* Skip error token. */
698 if (symbol == errtoken)
699 continue;
700
701 /* If this string has an alias, then it is necessarily the alias
702 which is to be output. */
703 if (symbol->alias)
704 symbol = symbol->alias;
705
706 /* Don't output literal chars or strings (when defined only as a
707 string). Note that must be done after the alias resolution:
708 think about `%token 'f' "f"'. */
709 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
710 continue;
711
712 /* Don't #define nonliteral tokens whose names contain periods
713 or '$' (as does the default value of the EOF token). */
714 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
715 continue;
716
717 fprintf (out, "%s[[[%s]], [%d]]",
718 first ? "" : ",\n", symbol->tag, number);
719
720 first = 0;
721 }
722 fputs ("])\n\n", out);
723 }
724
725
726 /*----------------------------------------.
727 | Output the symbol destructors to OOUT. |
728 `----------------------------------------*/
729
730 static void
731 symbol_destructors_output (FILE *out)
732 {
733 int i;
734 int first = 1;
735
736 fputs ("m4_define([b4_symbol_destructors], \n[", out);
737 for (i = 0; i < nsyms; ++i)
738 if (symbols[i]->destructor)
739 {
740 symbol_t *symbol = symbols[i];
741
742 /* Filename, lineno,
743 Symbol-name, Symbol-number,
744 destructor, typename. */
745 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
746 first ? "" : ",\n",
747 infile, symbol->destructor_location.first_line,
748 symbol_tag_get (symbol),
749 symbol->number,
750 symbol->destructor,
751 symbol->type_name);
752
753 first = 0;
754 }
755 fputs ("])\n\n", out);
756 }
757
758
759 /*-------------------------------------.
760 | Output the symbol printers to OOUT. |
761 `-------------------------------------*/
762
763 static void
764 symbol_printers_output (FILE *out)
765 {
766 int i;
767 int first = 1;
768
769 fputs ("m4_define([b4_symbol_printers], \n[", out);
770 for (i = 0; i < nsyms; ++i)
771 if (symbols[i]->destructor)
772 {
773 symbol_t *symbol = symbols[i];
774
775 /* Filename, lineno,
776 Symbol-name, Symbol-number,
777 destructor, typename. */
778 fprintf (out, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
779 first ? "" : ",\n",
780 infile, symbol->printer_location.first_line,
781 symbol_tag_get (symbol),
782 symbol->number,
783 symbol->printer,
784 symbol->type_name);
785
786 first = 0;
787 }
788 fputs ("])\n\n", out);
789 }
790
791
792 static void
793 save_column (symbol_number_t symbol, state_number_t default_state)
794 {
795 int i;
796 short *sp;
797 short *sp1;
798 short *sp2;
799 int count;
800 int symno = symbol - ntokens + state_number_as_int (nstates);
801
802 int begin = goto_map[symbol];
803 int end = goto_map[symbol + 1];
804
805 count = 0;
806 for (i = begin; i < end; i++)
807 if (to_state[i] != default_state)
808 count++;
809
810 if (count == 0)
811 return;
812
813 froms[symno] = sp1 = sp = XCALLOC (short, count);
814 tos[symno] = sp2 = XCALLOC (short, count);
815
816 for (i = begin; i < end; i++)
817 if (to_state[i] != default_state)
818 {
819 *sp1++ = from_state[i];
820 *sp2++ = to_state[i];
821 }
822
823 tally[symno] = count;
824 width[symno] = sp1[-1] - sp[0] + 1;
825 }
826
827
828 static state_number_t
829 default_goto (symbol_number_t symbol)
830 {
831 state_number_t s;
832 int i;
833 int m = goto_map[symbol];
834 int n = goto_map[symbol + 1];
835 state_number_t default_state = (state_number_t) -1;
836 int max = 0;
837
838 if (m == n)
839 return (state_number_t) -1;
840
841 for (s = 0; s < nstates; s++)
842 state_count[s] = 0;
843
844 for (i = m; i < n; i++)
845 state_count[to_state[i]]++;
846
847 for (s = 0; s < nstates; s++)
848 if (state_count[s] > max)
849 {
850 max = state_count[s];
851 default_state = s;
852 }
853
854 return default_state;
855 }
856
857
858 /*-------------------------------------------------------------------.
859 | Figure out what to do after reducing with each rule, depending on |
860 | the saved state from before the beginning of parsing the data that |
861 | matched this rule. |
862 | |
863 | The YYDEFGOTO table is output now. The detailed info is saved for |
864 | putting into YYTABLE later. |
865 `-------------------------------------------------------------------*/
866
867 static void
868 goto_actions (void)
869 {
870 symbol_number_t i;
871 state_number_t *yydefgoto = XMALLOC (state_number_t, nsyms - ntokens);
872
873 state_count = XCALLOC (short, nstates);
874 for (i = ntokens; i < nsyms; ++i)
875 {
876 state_number_t default_state = default_goto (i);
877 save_column (i, default_state);
878 yydefgoto[i - ntokens] = default_state;
879 }
880
881 muscle_insert_state_number_table ("defgoto", yydefgoto,
882 yydefgoto[0], 1, nsyms - ntokens);
883 XFREE (state_count);
884 XFREE (yydefgoto);
885 }
886
887
888 /* The next few functions decide how to pack the actions and gotos
889 information into yytable. */
890
891 static void
892 sort_actions (void)
893 {
894 int i;
895
896 order = XCALLOC (short, nvectors);
897 nentries = 0;
898
899 for (i = 0; i < nvectors; i++)
900 if (tally[i] > 0)
901 {
902 int k;
903 int t = tally[i];
904 int w = width[i];
905 int j = nentries - 1;
906
907 while (j >= 0 && (width[order[j]] < w))
908 j--;
909
910 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
911 j--;
912
913 for (k = nentries - 1; k > j; k--)
914 order[k + 1] = order[k];
915
916 order[j + 1] = i;
917 nentries++;
918 }
919 }
920
921
922 static int
923 matching_state (int vector)
924 {
925 int i = order[vector];
926 int t;
927 int w;
928 int prev;
929
930 if (i >= (int) nstates)
931 return -1;
932
933 t = tally[i];
934 w = width[i];
935
936 for (prev = vector - 1; prev >= 0; prev--)
937 {
938 int j = order[prev];
939 int k;
940 int match = 1;
941
942 if (width[j] != w || tally[j] != t)
943 return -1;
944
945 for (k = 0; match && k < t; k++)
946 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
947 match = 0;
948
949 if (match)
950 return j;
951 }
952
953 return -1;
954 }
955
956
957 static int
958 pack_vector (int vector)
959 {
960 int i = order[vector];
961 int j;
962 int t = tally[i];
963 int loc = 0;
964 short *from = froms[i];
965 short *to = tos[i];
966 unsigned int *conflict_to = conflict_tos[i];
967
968 assert (t);
969
970 for (j = lowzero - from[0]; j < (int) table_size; j++)
971 {
972 int k;
973 int ok = 1;
974
975 for (k = 0; ok && k < t; k++)
976 {
977 loc = j + state_number_as_int (from[k]);
978 if (loc > (int) table_size)
979 table_grow (loc);
980
981 if (table[loc] != 0)
982 ok = 0;
983 }
984
985 for (k = 0; ok && k < vector; k++)
986 if (pos[k] == j)
987 ok = 0;
988
989 if (ok)
990 {
991 for (k = 0; k < t; k++)
992 {
993 loc = j + state_number_as_int (from[k]);
994 table[loc] = state_number_as_int (to[k]);
995 if (glr_parser && conflict_to != NULL)
996 conflict_table[loc] = conflict_to[k];
997 check[loc] = state_number_as_int (from[k]);
998 }
999
1000 while (table[lowzero] != 0)
1001 lowzero++;
1002
1003 if (loc > high)
1004 high = loc;
1005
1006 return j;
1007 }
1008 }
1009 #define pack_vector_succeeded 0
1010 assert (pack_vector_succeeded);
1011 return 0;
1012 }
1013
1014
1015 static void
1016 pack_table (void)
1017 {
1018 int i;
1019 int place;
1020 int state;
1021
1022 base = XCALLOC (short, nvectors);
1023 pos = XCALLOC (short, nentries);
1024 table = XCALLOC (short, table_size);
1025 if (glr_parser)
1026 conflict_table = XCALLOC (unsigned int, table_size);
1027 check = XCALLOC (short, table_size);
1028
1029 lowzero = 0;
1030 high = 0;
1031
1032 for (i = 0; i < nvectors; i++)
1033 base[i] = SHRT_MIN;
1034
1035 for (i = 0; i < (int) table_size; i++)
1036 check[i] = -1;
1037
1038 for (i = 0; i < nentries; i++)
1039 {
1040 state = matching_state (i);
1041
1042 if (state < 0)
1043 place = pack_vector (i);
1044 else
1045 place = base[state];
1046
1047 pos[i] = place;
1048 base[order[i]] = place;
1049 }
1050
1051 for (i = 0; i < nvectors; i++)
1052 {
1053 XFREE (froms[i]);
1054 XFREE (tos[i]);
1055 XFREE (conflict_tos[i]);
1056 }
1057
1058 XFREE (froms);
1059 XFREE (tos);
1060 XFREE (conflict_tos);
1061 XFREE (pos);
1062 }
1063
1064 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1065 and the vectors whose elements index the portion starts */
1066
1067 static void
1068 output_base (void)
1069 {
1070 /* Output pact. */
1071 muscle_insert_short_table ("pact", base,
1072 base[0], 1, nstates);
1073
1074 /* Output pgoto. */
1075 muscle_insert_short_table ("pgoto", base,
1076 base[nstates], nstates + 1, nvectors);
1077 XFREE (base);
1078 }
1079
1080
1081 static void
1082 output_table (void)
1083 {
1084 muscle_insert_short_table ("table", table,
1085 table[0], 1, high + 1);
1086 XFREE (table);
1087 }
1088
1089
1090 static void
1091 output_conflicts (void)
1092 {
1093 /* GLR parsing slightly modifies yytable and yycheck
1094 (and thus yypact) so that in states with unresolved conflicts,
1095 the default reduction is not used in the conflicted entries, so
1096 that there is a place to put a conflict pointer. This means that
1097 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1098 avoid accidents by not writing them out in that case. */
1099 if (! glr_parser)
1100 return;
1101
1102 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
1103 conflict_table[0], 1, high+1);
1104 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
1105 conflict_list[0], 1, conflict_list_cnt);
1106
1107 XFREE (conflict_table);
1108 XFREE (conflict_list);
1109 }
1110
1111
1112 static void
1113 output_check (void)
1114 {
1115 muscle_insert_short_table ("check", check,
1116 check[0], 1, high + 1);
1117 XFREE (check);
1118 }
1119
1120 /*-----------------------------------------------------------------.
1121 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1122 | and yycheck. |
1123 `-----------------------------------------------------------------*/
1124
1125 static void
1126 output_actions (void)
1127 {
1128 /* That's a poor way to make sure the sizes are properly corelated,
1129 in particular the signedness is not taking into account, but it's
1130 not useless. */
1131 assert (sizeof (nvectors) >= sizeof (nstates));
1132 assert (sizeof (nvectors) >= sizeof (nvars));
1133
1134 nvectors = state_number_as_int (nstates) + nvars;
1135
1136 froms = XCALLOC (short *, nvectors);
1137 tos = XCALLOC (short *, nvectors);
1138 conflict_tos = XCALLOC (unsigned int *, nvectors);
1139 tally = XCALLOC (short, nvectors);
1140 width = XCALLOC (short, nvectors);
1141
1142 token_actions ();
1143 bitsetv_free (LA);
1144 free (LArule);
1145
1146 goto_actions ();
1147 XFREE (goto_map + ntokens);
1148 XFREE (from_state);
1149 XFREE (to_state);
1150
1151 sort_actions ();
1152 pack_table ();
1153
1154 output_base ();
1155 output_table ();
1156 output_conflicts ();
1157
1158 output_check ();
1159 }
1160
1161 \f
1162 /*----------------------.
1163 | Run our backend, M4. |
1164 `----------------------*/
1165
1166 static void
1167 m4_invoke (const char *definitions)
1168 {
1169 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1170 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
1171 const char *m4 = getenv ("M4");
1172 int pkg_data_len;
1173 char *full_skeleton;
1174
1175 if (!m4)
1176 m4 = M4;
1177 if (!bison_pkgdatadir)
1178 bison_pkgdatadir = PKGDATADIR;
1179 pkg_data_len = strlen (bison_pkgdatadir);
1180 full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
1181 if (bison_pkgdatadir[pkg_data_len-1] == '/')
1182 sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
1183 else
1184 sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
1185 if (trace_flag)
1186 fprintf (stderr,
1187 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1188 m4, bison_pkgdatadir, definitions, full_skeleton);
1189 skel_in = readpipe (m4,
1190 "-I", bison_pkgdatadir,
1191 "m4sugar/m4sugar.m4",
1192 definitions,
1193 full_skeleton,
1194 NULL);
1195 XFREE (full_skeleton);
1196 if (!skel_in)
1197 error (EXIT_FAILURE, errno, "cannot run m4");
1198 skel_lex ();
1199
1200 }
1201
1202 /*---------------------------.
1203 | Call the skeleton parser. |
1204 `---------------------------*/
1205
1206 static void
1207 output_skeleton (void)
1208 {
1209 /* Store the definition of all the muscles. */
1210 const char *tempdir = getenv ("TMPDIR");
1211 char *tempfile = NULL;
1212 FILE *out = NULL;
1213 int fd;
1214
1215 if (tempdir == NULL)
1216 tempdir = DEFAULT_TMPDIR;
1217 tempfile = xmalloc (strlen (tempdir) + 11);
1218 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
1219 fd = mkstemp (tempfile);
1220 if (fd == -1)
1221 error (EXIT_FAILURE, errno, "%s", tempfile);
1222
1223 out = fdopen (fd, "w");
1224 if (out == NULL)
1225 error (EXIT_FAILURE, errno, "%s", tempfile);
1226
1227 /* There are no comments, especially not `#': we do want M4 expansion
1228 after `#': think of CPP macros! */
1229 fputs ("m4_changecom()\n", out);
1230 fputs ("m4_init()\n", out);
1231
1232 actions_output (out);
1233 merger_output (out);
1234 token_definitions_output (out);
1235 symbol_destructors_output (out);
1236 symbol_printers_output (out);
1237
1238 muscles_m4_output (out);
1239
1240 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
1241 fputs ("m4_divert_push(0)dnl\n", out);
1242 xfclose (out);
1243
1244 m4_invoke (tempfile);
1245
1246 /* If `debugging', keep this file alive. */
1247 if (!trace_flag)
1248 unlink (tempfile);
1249
1250 free (tempfile);
1251 }
1252
1253 static void
1254 prepare (void)
1255 {
1256 MUSCLE_INSERT_INT ("last", high);
1257 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
1258 MUSCLE_INSERT_INT ("pure", pure_parser);
1259 MUSCLE_INSERT_INT ("nsym", nsyms);
1260 MUSCLE_INSERT_INT ("debug", debug_flag);
1261 MUSCLE_INSERT_INT ("final", final_state->number);
1262 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1263 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
1264 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
1265 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
1266
1267 /* FIXME: This is wrong: the muscles should decide whether they hold
1268 a copy or not, but the situation is too obscure currently. */
1269 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1270 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1271 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1272 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
1273
1274 MUSCLE_INSERT_INT ("nnts", nvars);
1275 MUSCLE_INSERT_INT ("nrules", nrules);
1276 MUSCLE_INSERT_INT ("nstates", nstates);
1277 MUSCLE_INSERT_INT ("ntokens", ntokens);
1278
1279 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1280 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
1281
1282 /* Copy definitions in directive. */
1283 obstack_1grow (&pre_prologue_obstack, 0);
1284 obstack_1grow (&post_prologue_obstack, 0);
1285 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1286 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
1287
1288 /* Find the right skeleton file. */
1289 if (!skeleton)
1290 {
1291 if (glr_parser)
1292 skeleton = "glr.c";
1293 else
1294 skeleton = "yacc.c";
1295 }
1296
1297 /* Parse the skeleton file and output the needed parsers. */
1298 muscle_insert ("skeleton", skeleton);
1299 }
1300
1301
1302 /*----------------------------------------------------------.
1303 | Output the parsing tables and the parser code to ftable. |
1304 `----------------------------------------------------------*/
1305
1306 void
1307 output (void)
1308 {
1309 obstack_init (&format_obstack);
1310
1311 prepare_tokens ();
1312 prepare_rules ();
1313 prepare_states ();
1314 output_actions ();
1315
1316 prepare ();
1317
1318 /* Process the selected skeleton file. */
1319 output_skeleton ();
1320
1321 obstack_free (&format_obstack, NULL);
1322 obstack_free (&pre_prologue_obstack, NULL);
1323 obstack_free (&post_prologue_obstack, NULL);
1324 }