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