1 /* Output the generated parsing program for bison,
2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
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)
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.
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
23 /* The parser tables consist of these tables.
25 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 YYTNAME = vector of string-names indexed by bison token number.
30 YYTOKNUM = vector of yylex token numbers corresponding to entries
33 YYRLINE = vector of line-numbers of all rules. For yydebug
36 YYRHS = vector of items of all rules. This is exactly what RITEMS
37 contains. For yydebug and for semantic parser.
39 YYPRHS[R] = index in YYRHS of first item for rule R.
41 YYR1[R] = symbol number of symbol that rule R derives.
43 YYR2[R] = number of symbols composing right hand side of rule R.
45 YYSTOS[S] = the symbol number of the symbol that leads to state S.
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
51 YYDEFGOTO[I] = default state to go to after a reduction of a rule
52 that generates variable NTOKENS + I, except when YYTABLE specifies
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
59 If the value in YYTABLE is positive, we shift the token and go to
62 If the value is negative, it is minus a rule number to reduce by.
64 If the value is zero, the default action from YYDEFACT[S] is used.
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.
72 YYTABLE = a vector filled with portions for different uses, found
73 via YYPACT and YYPGOTO.
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
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.
85 YYFINAL = the state number of the termination state. YYFLAG = most
86 negative short int. Used to flag ?? */
101 #include "conflicts.h"
102 #include "muscle_tab.h"
104 /* From src/scan-skel.l. */
105 void m4_invoke
PARAMS ((const char *definitions
));
108 /* Several tables will be indexed both by state and nonterminal
109 numbers. We call `vector' such a thing (= either a state or a
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))
125 /* FROMS and TOS are indexed by vector_number_t.
127 If VECTOR is a nonterminal, (FROMS[VECTOR], TOS[VECTOR]) form an
128 array of state numbers of the non defaulted GOTO on VECTOR.
130 If VECTOR is a state, TOS[VECTOR] is the array of actions to do on
131 the (array of) symbols FROMS[VECTOR].
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 =
138 FROMS therefore contains symbol_number_t and action_number_t,
139 TOS state_number_t and action_number_t,
141 WIDTH differences of FROMS.
143 Let base_t be the type of FROMS, TOS, and WIDTH. */
145 #define BASE_MAX ((base_t) INT_MAX)
146 #define BASE_MIN ((base_t) INT_MIN)
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
;
155 /* For a given state, N = ACTROW[SYMBOL]:
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)
165 static action_t
*actrow
= NULL
;
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
;
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
;
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
;
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;
200 static struct obstack format_obstack
;
202 int error_verbose
= 0;
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 `----------------------------------------------------------------*/
212 table_grow (size_t desired
)
214 size_t old_size
= table_size
;
216 while (table_size
<= desired
)
220 fprintf (stderr
, "growing table and check from: %d to %d\n",
221 old_size
, table_size
);
223 table
= XREALLOC (table
, base_t
, table_size
);
224 check
= XREALLOC (check
, base_t
, table_size
);
226 conflict_table
= XREALLOC (conflict_table
, unsigned int, table_size
);
228 for (/* Nothing. */; old_size
< table_size
; ++old_size
)
231 check
[old_size
] = -1;
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 |
241 `-------------------------------------------------------------------*/
244 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
247 Name (const char *name, \
258 obstack_fgrow1 (&format_obstack, "%6d", first); \
259 for (i = begin; i < end; ++i) \
261 obstack_1grow (&format_obstack, ','); \
264 obstack_sgrow (&format_obstack, "\n "); \
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]; \
275 obstack_1grow (&format_obstack, 0); \
276 muscle_insert (name, obstack_finish (&format_obstack)); \
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), \
283 obstack_fgrow1 (&format_obstack, "%s_max", name); \
284 obstack_1grow (&format_obstack, 0); \
285 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
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
)
299 /*-----------------------------------------------------------------.
300 | Prepare the muscles related to the tokens: translate, tname, and |
302 `-----------------------------------------------------------------*/
305 prepare_tokens (void)
307 muscle_insert_symbol_number_table ("translate",
309 token_translations
[0],
310 1, max_user_token_number
+ 1);
315 for (i
= 0; i
< nsyms
; i
++)
317 /* Be sure not to use twice the same QUOTEARG slot:
318 SYMBOL_TAG_GET uses slot 0. */
320 quotearg_n_style (1, c_quoting_style
,
322 /* Width of the next token, including the two quotes, the coma
324 int strsize
= strlen (cp
) + 2;
326 if (j
+ strsize
> 75)
328 obstack_sgrow (&format_obstack
, "\n ");
332 obstack_sgrow (&format_obstack
, cp
);
333 obstack_sgrow (&format_obstack
, ", ");
336 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
338 obstack_sgrow (&format_obstack
, "0");
340 /* Finish table and store. */
341 obstack_1grow (&format_obstack
, 0);
342 muscle_insert ("tname", obstack_finish (&format_obstack
));
345 /* Output YYTOKNUM. */
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
);
358 /*-------------------------------------------------------------.
359 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
360 | rline, dprec, merger |
361 `-------------------------------------------------------------*/
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
);
376 for (r
= 0; r
< nrules
; ++r
)
378 item_number_t
*rhsp
= NULL
;
379 /* Index of rule R in RHS. */
381 /* RHS of the rule R. */
382 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
384 /* LHS of the rule R. */
385 r1
[r
] = rules
[r
].lhs
->number
;
386 /* Length of rule R's RHS. */
388 /* Separator in RHS. */
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
;
397 assert (i
== nritems
);
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
);
416 /*--------------------------------------------.
417 | Prepare the muscles related to the states. |
418 `--------------------------------------------*/
421 prepare_states (void)
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
,
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 `-------------------------------------------------------------------*/
444 conflict_row (state_t
*state
)
451 for (j
= 0; j
< ntokens
; j
+= 1)
454 conflrow
[j
] = conflict_list_cnt
;
456 /* Find all reductions for token J, and record all that do not
458 for (i
= 0; i
< state
->nlookaheads
; i
+= 1)
459 if (bitset_test (state
->lookaheads
[i
], j
)
461 != rule_number_as_item_number (state
->lookaheads_rule
[i
]->number
)))
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;
470 /* Leave a 0 at the end. */
471 assert (conflict_list_free
> 0);
472 conflict_list_cnt
+= 1;
473 conflict_list_free
-= 1;
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. |
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. |
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 `------------------------------------------------------------------*/
498 action_row (state_t
*state
)
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. */
509 for (i
= 0; i
< ntokens
; i
++)
510 actrow
[i
] = conflrow
[i
] = 0;
515 bitset_iterator biter
;
516 /* loop over all the rules available here which require
518 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
519 /* and find each token which the rule finds acceptable
521 BITSET_FOR_EACH (biter
, state
->lookaheads
[i
], j
, 0)
523 /* and record this rule as the rule to use if that
526 conflicted
= conflrow
[j
] = 1;
527 actrow
[j
] = rule_number_as_item_number (state
->lookaheads_rule
[i
]->number
);
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
534 FOR_EACH_SHIFT (transitions
, i
)
536 symbol_number_t symbol
= TRANSITION_SYMBOL (transitions
, i
);
537 state_t
*shift_state
= transitions
->states
[i
];
539 if (actrow
[symbol
] != 0)
540 conflicted
= conflrow
[symbol
] = 1;
541 actrow
[symbol
] = state_number_as_int (shift_state
->number
);
543 /* Do not use any default reduction if there is a shift for
545 if (symbol
== errtoken
->number
)
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
++)
553 symbol_t
*symbol
= errp
->symbols
[i
];
554 actrow
[symbol
->number
] = ACTION_MIN
;
557 /* Now find the most common reduction and make it the default action
560 if (redp
->num
>= 1 && !nodefault
)
562 if (state
->consistent
)
563 default_rule
= redp
->rules
[0];
567 for (i
= 0; i
< state
->nlookaheads
; i
++)
570 rule_t
*rule
= state
->lookaheads_rule
[i
];
573 for (j
= 0; j
< ntokens
; j
++)
574 if (actrow
[j
] == rule_number_as_item_number (rule
->number
))
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". */
593 for (j
= 0; j
< ntokens
; j
++)
594 if (actrow
[j
] == rule_number_as_item_number (default_rule
->number
)
595 && ! (glr_parser
&& conflrow
[j
]))
601 /* If have no default rule, the default is an error.
602 So replace any action which says "error" with "use default". */
605 for (i
= 0; i
< ntokens
; i
++)
606 if (actrow
[i
] == ACTION_MIN
)
610 conflict_row (state
);
616 /*--------------------------------------------.
617 | Set FROMS, TOS, TALLY and WIDTH for STATE. |
618 `--------------------------------------------*/
621 save_row (state_number_t state
)
628 unsigned int *sp3
= NULL
;
630 /* Number of non default actions in STATE. */
632 for (i
= 0; i
< ntokens
; i
++)
639 /* Allocate non defaulted actions. */
640 froms
[state
] = sp1
= sp
= XCALLOC (base_t
, count
);
641 tos
[state
] = sp2
= XCALLOC (base_t
, count
);
643 conflict_tos
[state
] = sp3
= XCALLOC (unsigned int, count
);
645 conflict_tos
[state
] = NULL
;
647 /* Store non defaulted actions. */
648 for (i
= 0; i
< ntokens
; i
++)
654 *sp3
++ = conflrow
[i
];
657 tally
[state
] = count
;
658 width
[state
] = sp1
[-1] - sp
[0] + 1;
662 /*------------------------------------------------------------------.
663 | Figure out the actions for the specified state, indexed by |
664 | lookahead token type. |
666 | The YYDEFACT table is output now. The detailed info is saved for |
667 | putting into YYTABLE later. |
668 `------------------------------------------------------------------*/
674 int nconflict
= conflicts_total_count ();
676 rule_number_t
*yydefact
= XCALLOC (rule_number_t
, nstates
);
678 actrow
= XCALLOC (action_t
, ntokens
);
679 conflrow
= XCALLOC (unsigned int, ntokens
);
683 conflict_list
= XCALLOC (unsigned int, 1 + 2 * nconflict
);
684 conflict_list_free
= 2 * nconflict
;
685 conflict_list_cnt
= 1;
688 conflict_list_free
= conflict_list_cnt
= 0;
690 for (i
= 0; i
< nstates
; ++i
)
692 rule_t
*default_rule
= action_row (states
[i
]);
693 yydefact
[i
] = default_rule
? default_rule
->number
+ 1 : 0;
697 muscle_insert_rule_number_table ("defact", yydefact
,
698 yydefact
[0], 1, nstates
);
705 /*-----------------------------.
706 | Output the actions to OOUT. |
707 `-----------------------------*/
710 actions_output (FILE *out
)
714 fputs ("m4_define([b4_actions], \n[[", out
);
715 for (r
= 0; r
< nrules
; ++r
)
718 fprintf (out
, " case %d:\n", r
+ 1);
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",
728 fputs ("]])\n\n", out
);
731 /*--------------------------------------.
732 | Output the merge functions to OUT. |
733 `--------------------------------------*/
736 merger_output (FILE *out
)
741 fputs ("m4_define([b4_mergers], \n[[", out
);
742 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
744 if (p
->type
[0] == '\0')
745 fprintf (out
, " case %d: yyval = %s (*yy0, *yy1); break;\n",
748 fprintf (out
, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
749 n
, p
->type
, p
->name
);
751 fputs ("]])\n\n", out
);
754 /*---------------------------------------.
755 | Output the tokens definition to OOUT. |
756 `---------------------------------------*/
759 token_definitions_output (FILE *out
)
764 fputs ("m4_define([b4_tokens], \n[", out
);
765 for (i
= 0; i
< ntokens
; ++i
)
767 symbol_t
*symbol
= symbols
[i
];
768 int number
= symbol
->user_token_number
;
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
773 assert (number
!= USER_NUMBER_ALIAS
);
775 /* Skip error token. */
776 if (symbol
== errtoken
)
779 /* If this string has an alias, then it is necessarily the alias
780 which is to be output. */
782 symbol
= symbol
->alias
;
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] == '\"')
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
, '$'))
795 fprintf (out
, "%s[[[%s]], [%d]]",
796 first
? "" : ",\n", symbol
->tag
, number
);
800 fputs ("])\n\n", out
);
804 /*----------------------------------------.
805 | Output the symbol destructors to OOUT. |
806 `----------------------------------------*/
809 symbol_destructors_output (FILE *out
)
814 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
815 for (i
= 0; i
< nsyms
; ++i
)
816 if (symbols
[i
]->destructor
)
818 symbol_t
*symbol
= symbols
[i
];
821 Symbol-name, Symbol-number,
822 destructor, typename. */
823 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
825 infile
, symbol
->destructor_location
.first_line
,
833 fputs ("])\n\n", out
);
837 /*-------------------------------------.
838 | Output the symbol printers to OOUT. |
839 `-------------------------------------*/
842 symbol_printers_output (FILE *out
)
847 fputs ("m4_define([b4_symbol_printers], \n[", out
);
848 for (i
= 0; i
< nsyms
; ++i
)
849 if (symbols
[i
]->destructor
)
851 symbol_t
*symbol
= symbols
[i
];
854 Symbol-name, Symbol-number,
855 destructor, typename. */
856 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
858 infile
, symbol
->printer_location
.first_line
,
866 fputs ("])\n\n", out
);
870 /*------------------------------------------------------------------.
871 | Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], |
872 | i.e., the information related to non defaulted GOTO on the nterm |
875 | DEFAULT_STATE is the principal destination on SYMBOL, i.e., the |
876 | default GOTO destination on SYMBOL. |
877 `------------------------------------------------------------------*/
880 save_column (symbol_number_t symbol
, state_number_t default_state
)
887 vector_number_t symno
= symbol_number_to_vector_number (symbol
);
889 goto_number_t begin
= goto_map
[symbol
];
890 goto_number_t end
= goto_map
[symbol
+ 1];
892 /* Number of non default GOTO. */
894 for (i
= begin
; i
< end
; i
++)
895 if (to_state
[i
] != default_state
)
901 /* Allocate room for non defaulted gotos. */
902 froms
[symno
] = sp1
= sp
= XCALLOC (base_t
, count
);
903 tos
[symno
] = sp2
= XCALLOC (base_t
, count
);
905 /* Store the state numbers of the non defaulted gotos. */
906 for (i
= begin
; i
< end
; i
++)
907 if (to_state
[i
] != default_state
)
909 *sp1
++ = from_state
[i
];
910 *sp2
++ = to_state
[i
];
913 tally
[symno
] = count
;
914 width
[symno
] = sp1
[-1] - sp
[0] + 1;
918 /*----------------------------------------------------------------.
919 | Return `the' most common destination GOTO on SYMBOL (a nterm). |
920 `----------------------------------------------------------------*/
922 static state_number_t
923 default_goto (symbol_number_t symbol
, short state_count
[])
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;
933 return (state_number_t
) -1;
935 for (s
= 0; s
< nstates
; s
++)
938 for (i
= m
; i
< n
; i
++)
939 state_count
[to_state
[i
]]++;
941 for (s
= 0; s
< nstates
; s
++)
942 if (state_count
[s
] > max
)
944 max
= state_count
[s
];
948 return default_state
;
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. |
957 | The YYDEFGOTO table is output now. The detailed info is saved for |
958 | putting into YYTABLE later. |
959 `-------------------------------------------------------------------*/
965 state_number_t
*yydefgoto
= XMALLOC (state_number_t
, nvars
);
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
)
972 state_number_t default_state
= default_goto (i
, state_count
);
973 save_column (i
, default_state
);
974 yydefgoto
[i
- ntokens
] = default_state
;
977 muscle_insert_state_number_table ("defgoto", yydefgoto
,
978 yydefgoto
[0], 1, nsyms
- ntokens
);
984 /*------------------------------------------------------------------.
985 | Compute ORDER, a reordering of vectors, in order to decide how to |
986 | pack the actions and gotos information into yytable. |
987 `------------------------------------------------------------------*/
996 for (i
= 0; i
< nvectors
; i
++)
1002 int j
= nentries
- 1;
1004 while (j
>= 0 && (width
[order
[j
]] < w
))
1007 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
1010 for (k
= nentries
- 1; k
> j
; k
--)
1011 order
[k
+ 1] = order
[k
];
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
1023 In any other case, return -1. */
1025 static state_number_t
1026 matching_state (vector_number_t vector
)
1028 vector_number_t i
= order
[vector
];
1033 /* If VECTOR is a nterm, return -1. */
1034 if (i
>= (int) nstates
)
1040 for (prev
= vector
- 1; prev
>= 0; prev
--)
1042 vector_number_t j
= order
[prev
];
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
)
1051 for (k
= 0; match
&& k
< t
; k
++)
1052 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
1064 pack_vector (vector_number_t vector
)
1066 vector_number_t i
= order
[vector
];
1070 base_t
*from
= froms
[i
];
1071 base_t
*to
= tos
[i
];
1072 unsigned int *conflict_to
= conflict_tos
[i
];
1076 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
1081 for (k
= 0; ok
&& k
< t
; k
++)
1083 loc
= j
+ state_number_as_int (from
[k
]);
1084 if (loc
> (int) table_size
)
1087 if (table
[loc
] != 0)
1091 for (k
= 0; ok
&& k
< vector
; k
++)
1097 for (k
= 0; k
< t
; k
++)
1101 if (glr_parser
&& conflict_to
!= NULL
)
1102 conflict_table
[loc
] = conflict_to
[k
];
1103 check
[loc
] = from
[k
];
1106 while (table
[lowzero
] != 0)
1112 if (j
< BASE_MIN
|| BASE_MAX
< j
)
1113 fatal ("base_t too small to hold %d\n", j
);
1117 #define pack_vector_succeeded 0
1118 assert (pack_vector_succeeded
);
1123 /*-------------------------------------------------------------.
1124 | Remap the negative infinite in TAB from NINF to the greatest |
1125 | possible smallest value. Return it. |
1127 | In most case this allows us to use shorts instead of ints in |
1129 `-------------------------------------------------------------*/
1132 table_ninf_remap (base_t tab
[], size_t size
, base_t ninf
)
1137 for (i
= 0; i
< size
; i
++)
1138 if (tab
[i
] < res
&& tab
[i
] != ninf
)
1143 for (i
= 0; i
< size
; i
++)
1155 base
= XCALLOC (base_t
, nvectors
);
1156 pos
= XCALLOC (base_t
, nentries
);
1157 table
= XCALLOC (base_t
, table_size
);
1159 conflict_table
= XCALLOC (unsigned int, table_size
);
1160 check
= XCALLOC (base_t
, table_size
);
1165 for (i
= 0; i
< nvectors
; i
++)
1168 for (i
= 0; i
< (int) table_size
; i
++)
1171 for (i
= 0; i
< nentries
; i
++)
1173 state_number_t state
= matching_state (i
);
1177 /* A new set of state actions, or a nonterminal. */
1178 place
= pack_vector (i
);
1180 /* Action of I were already coded for STATE. */
1181 place
= base
[state
];
1184 base
[order
[i
]] = place
;
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
);
1191 for (i
= 0; i
< nvectors
; i
++)
1195 XFREE (conflict_tos
[i
]);
1200 free (conflict_tos
);
1205 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1206 and the vectors whose elements index the portion starts. */
1212 muscle_insert_base_table ("pact", base
,
1213 base
[0], 1, nstates
);
1214 MUSCLE_INSERT_INT ("pact_ninf", base_ninf
);
1217 muscle_insert_base_table ("pgoto", base
,
1218 base
[nstates
], nstates
+ 1, nvectors
);
1226 muscle_insert_base_table ("table", table
,
1227 table
[0], 1, high
+ 1);
1228 MUSCLE_INSERT_INT ("table_ninf", table_ninf
);
1234 output_conflicts (void)
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. */
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
);
1250 XFREE (conflict_table
);
1251 XFREE (conflict_list
);
1258 muscle_insert_base_table ("check", check
,
1259 check
[0], 1, high
+ 1);
1263 /*-----------------------------------------------------------------.
1264 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1266 `-----------------------------------------------------------------*/
1269 prepare_actions (void)
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
1274 assert (sizeof (nvectors
) >= sizeof (nstates
));
1275 assert (sizeof (nvectors
) >= sizeof (nvars
));
1277 nvectors
= state_number_as_int (nstates
) + nvars
;
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
);
1290 XFREE (goto_map
+ ntokens
);
1294 order
= XCALLOC (vector_number_t
, nvectors
);
1304 output_conflicts ();
1310 /*---------------------------.
1311 | Call the skeleton parser. |
1312 `---------------------------*/
1315 output_skeleton (void)
1317 /* Store the definition of all the muscles. */
1318 const char *tempdir
= getenv ("TMPDIR");
1319 char *tempfile
= NULL
;
1323 if (tempdir
== NULL
)
1324 tempdir
= DEFAULT_TMPDIR
;
1325 tempfile
= xmalloc (strlen (tempdir
) + 11);
1326 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1327 fd
= mkstemp (tempfile
);
1329 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1331 out
= fdopen (fd
, "w");
1333 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
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
);
1340 actions_output (out
);
1341 merger_output (out
);
1342 token_definitions_output (out
);
1343 symbol_destructors_output (out
);
1344 symbol_printers_output (out
);
1346 muscles_m4_output (out
);
1348 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1349 fputs ("m4_divert_push(0)dnl\n", out
);
1352 m4_invoke (tempfile
);
1354 /* If `debugging', keep this file alive. */
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
);
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
);
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
);
1386 MUSCLE_INSERT_INT ("rules_number", nrules
);
1389 MUSCLE_INSERT_INT ("last", high
);
1390 MUSCLE_INSERT_INT ("final_state_number", final_state
->number
);
1391 MUSCLE_INSERT_INT ("states_number", nstates
);
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
));
1399 /* Find the right skeleton file. */
1405 skeleton
= "yacc.c";
1408 /* Parse the skeleton file and output the needed parsers. */
1409 muscle_insert ("skeleton", skeleton
);
1413 /*----------------------------------------------------------.
1414 | Output the parsing tables and the parser code to ftable. |
1415 `----------------------------------------------------------*/
1420 obstack_init (&format_obstack
);
1429 /* Process the selected skeleton file. */
1432 obstack_free (&format_obstack
, NULL
);
1433 obstack_free (&pre_prologue_obstack
, NULL
);
1434 obstack_free (&post_prologue_obstack
, NULL
);