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 0, 1, max_user_token_number
+ 1);
314 for (i
= 0; i
< nsyms
; i
++)
316 /* Be sure not to use twice the same QUOTEARG slot:
317 SYMBOL_TAG_GET uses slot 0. */
319 quotearg_n_style (1, c_quoting_style
,
321 /* Width of the next token, including the two quotes, the coma
323 int strsize
= strlen (cp
) + 2;
325 if (j
+ strsize
> 75)
327 obstack_sgrow (&format_obstack
, "\n ");
331 obstack_sgrow (&format_obstack
, cp
);
332 obstack_sgrow (&format_obstack
, ", ");
335 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
337 obstack_sgrow (&format_obstack
, "0");
339 /* Finish table and store. */
340 obstack_1grow (&format_obstack
, 0);
341 muscle_insert ("tname", obstack_finish (&format_obstack
));
344 /* Output YYTOKNUM. */
347 int *values
= XCALLOC (int, ntokens
);
348 for (i
= 0; i
< ntokens
; ++i
)
349 values
[i
] = symbols
[i
]->user_token_number
;
350 muscle_insert_int_table ("toknum", values
,
351 values
[0], 1, ntokens
);
357 /*-------------------------------------------------------------.
358 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
359 | rline, dprec, merger |
360 `-------------------------------------------------------------*/
367 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
368 unsigned int *prhs
= XMALLOC (unsigned int, nrules
);
369 unsigned int *rline
= XMALLOC (unsigned int, nrules
);
370 symbol_number_t
*r1
= XMALLOC (symbol_number_t
, nrules
);
371 unsigned int *r2
= XMALLOC (unsigned int, nrules
);
372 short *dprec
= XMALLOC (short, nrules
);
373 short *merger
= XMALLOC (short, nrules
);
375 for (r
= 0; r
< nrules
; ++r
)
377 item_number_t
*rhsp
= NULL
;
378 /* Index of rule R in RHS. */
380 /* RHS of the rule R. */
381 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
383 /* LHS of the rule R. */
384 r1
[r
] = rules
[r
].lhs
->number
;
385 /* Length of rule R's RHS. */
387 /* Separator in RHS. */
389 /* Line where rule was defined. */
390 rline
[r
] = rules
[r
].location
.first_line
;
391 /* Dynamic precedence (GLR) */
392 dprec
[r
] = rules
[r
].dprec
;
393 /* Merger-function index (GLR) */
394 merger
[r
] = rules
[r
].merger
;
396 assert (i
== nritems
);
398 muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
);
399 muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 0, nrules
);
400 muscle_insert_unsigned_int_table ("rline", rline
, 0, 0, nrules
);
401 muscle_insert_symbol_number_table ("r1", r1
, 0, 0, nrules
);
402 muscle_insert_unsigned_int_table ("r2", r2
, 0, 0, nrules
);
403 muscle_insert_short_table ("dprec", dprec
, 0, 0, nrules
);
404 muscle_insert_short_table ("merger", merger
, 0, 0, nrules
);
415 /*--------------------------------------------.
416 | Prepare the muscles related to the states. |
417 `--------------------------------------------*/
420 prepare_states (void)
423 symbol_number_t
*values
=
424 (symbol_number_t
*) alloca (sizeof (symbol_number_t
) * nstates
);
425 for (i
= 0; i
< nstates
; ++i
)
426 values
[i
] = states
[i
]->accessing_symbol
;
427 muscle_insert_symbol_number_table ("stos", values
,
432 /*-------------------------------------------------------------------.
433 | For GLR parsers, for each conflicted token in STATE, as indicated |
434 | by non-zero entries in CONFLROW, create a list of possible |
435 | reductions that are alternatives to the shift or reduction |
436 | currently recorded for that token in STATE. Store the alternative |
437 | reductions followed by a 0 in CONFLICT_LIST, updating |
438 | CONFLICT_LIST_CNT, and storing an index to the start of the list |
439 | back into CONFLROW. |
440 `-------------------------------------------------------------------*/
443 conflict_row (state_t
*state
)
450 for (j
= 0; j
< ntokens
; j
+= 1)
453 conflrow
[j
] = conflict_list_cnt
;
455 /* Find all reductions for token J, and record all that do not
457 for (i
= 0; i
< state
->nlookaheads
; i
+= 1)
458 if (bitset_test (state
->lookaheads
[i
], j
)
460 != rule_number_as_item_number (state
->lookaheads_rule
[i
]->number
)))
462 assert (conflict_list_free
> 0);
463 conflict_list
[conflict_list_cnt
]
464 = state
->lookaheads_rule
[i
]->number
+ 1;
465 conflict_list_cnt
+= 1;
466 conflict_list_free
-= 1;
469 /* Leave a 0 at the end. */
470 assert (conflict_list_free
> 0);
471 conflict_list_cnt
+= 1;
472 conflict_list_free
-= 1;
477 /*------------------------------------------------------------------.
478 | Decide what to do for each type of token if seen as the lookahead |
479 | token in specified state. The value returned is used as the |
480 | default action (yydefact) for the state. In addition, ACTROW is |
481 | filled with what to do for each kind of token, index by symbol |
482 | number, with zero meaning do the default action. The value |
483 | ACTION_MIN, a very negative number, means this situation is an |
484 | error. The parser recognizes this value specially. |
486 | This is where conflicts are resolved. The loop over lookahead |
487 | rules considered lower-numbered rules last, and the last rule |
488 | considered that likes a token gets to handle it. |
490 | For GLR parsers, also sets CONFLROW[SYM] to an index into |
491 | CONFLICT_LIST iff there is an unresolved conflict (s/r or r/r) |
492 | with symbol SYM. The default reduction is not used for a symbol |
493 | that has any such conflicts. |
494 `------------------------------------------------------------------*/
497 action_row (state_t
*state
)
500 rule_number_t default_rule
= -1;
501 reductions_t
*redp
= state
->reductions
;
502 transitions_t
*transitions
= state
->transitions
;
503 errs_t
*errp
= state
->errs
;
504 /* set nonzero to inhibit having any default reduction */
508 for (i
= 0; i
< ntokens
; i
++)
509 actrow
[i
] = conflrow
[i
] = 0;
514 bitset_iterator biter
;
515 /* loop over all the rules available here which require
517 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
518 /* and find each token which the rule finds acceptable
520 BITSET_FOR_EACH (biter
, state
->lookaheads
[i
], j
, 0)
522 /* and record this rule as the rule to use if that
525 conflicted
= conflrow
[j
] = 1;
526 actrow
[j
] = rule_number_as_item_number (state
->lookaheads_rule
[i
]->number
);
530 /* Now see which tokens are allowed for shifts in this state. For
531 them, record the shift as the thing to do. So shift is preferred
533 for (i
= 0; i
< transitions
->num
&& TRANSITION_IS_SHIFT (transitions
, i
); i
++)
534 if (!TRANSITION_IS_DISABLED (transitions
, i
))
536 symbol_number_t symbol
= TRANSITION_SYMBOL (transitions
, i
);
537 state_number_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
);
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_number_t symbol
= errp
->symbols
[i
];
554 actrow
[symbol
] = 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_number_t rule
= state
->lookaheads_rule
[i
]->number
;
573 for (j
= 0; j
< ntokens
; j
++)
574 if (actrow
[j
] == rule_number_as_item_number (rule
))
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
)
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". */
604 if (default_rule
== -1)
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 yydefact
[i
] = action_row (states
[i
]) + 1;
696 muscle_insert_rule_number_table ("defact", yydefact
,
697 yydefact
[0], 1, nstates
);
704 /*-----------------------------.
705 | Output the actions to OOUT. |
706 `-----------------------------*/
709 actions_output (FILE *out
)
713 fputs ("m4_define([b4_actions], \n[[", out
);
714 for (r
= 0; r
< nrules
; ++r
)
717 fprintf (out
, " case %d:\n", r
+ 1);
720 fprintf (out
, muscle_find ("linef"),
721 rules
[r
].action_location
.first_line
,
722 quotearg_style (c_quoting_style
,
723 muscle_find ("filename")));
724 fprintf (out
, " %s\n break;\n\n",
727 fputs ("]])\n\n", out
);
730 /*--------------------------------------.
731 | Output the merge functions to OUT. |
732 `--------------------------------------*/
735 merger_output (FILE *out
)
740 fputs ("m4_define([b4_mergers], \n[[", out
);
741 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
743 if (p
->type
[0] == '\0')
744 fprintf (out
, " case %d: yyval = %s (*yy0, *yy1); break;\n",
747 fprintf (out
, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
748 n
, p
->type
, p
->name
);
750 fputs ("]])\n\n", out
);
753 /*---------------------------------------.
754 | Output the tokens definition to OOUT. |
755 `---------------------------------------*/
758 token_definitions_output (FILE *out
)
763 fputs ("m4_define([b4_tokens], \n[", out
);
764 for (i
= 0; i
< ntokens
; ++i
)
766 symbol_t
*symbol
= symbols
[i
];
767 int number
= symbol
->user_token_number
;
769 /* At this stage, if there are literal aliases, they are part of
770 SYMBOLS, so we should not find symbols which are the aliases
772 assert (number
!= USER_NUMBER_ALIAS
);
774 /* Skip error token. */
775 if (symbol
== errtoken
)
778 /* If this string has an alias, then it is necessarily the alias
779 which is to be output. */
781 symbol
= symbol
->alias
;
783 /* Don't output literal chars or strings (when defined only as a
784 string). Note that must be done after the alias resolution:
785 think about `%token 'f' "f"'. */
786 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
789 /* Don't #define nonliteral tokens whose names contain periods
790 or '$' (as does the default value of the EOF token). */
791 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
794 fprintf (out
, "%s[[[%s]], [%d]]",
795 first
? "" : ",\n", symbol
->tag
, number
);
799 fputs ("])\n\n", out
);
803 /*----------------------------------------.
804 | Output the symbol destructors to OOUT. |
805 `----------------------------------------*/
808 symbol_destructors_output (FILE *out
)
813 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
814 for (i
= 0; i
< nsyms
; ++i
)
815 if (symbols
[i
]->destructor
)
817 symbol_t
*symbol
= symbols
[i
];
820 Symbol-name, Symbol-number,
821 destructor, typename. */
822 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
824 infile
, symbol
->destructor_location
.first_line
,
832 fputs ("])\n\n", out
);
836 /*-------------------------------------.
837 | Output the symbol printers to OOUT. |
838 `-------------------------------------*/
841 symbol_printers_output (FILE *out
)
846 fputs ("m4_define([b4_symbol_printers], \n[", out
);
847 for (i
= 0; i
< nsyms
; ++i
)
848 if (symbols
[i
]->destructor
)
850 symbol_t
*symbol
= symbols
[i
];
853 Symbol-name, Symbol-number,
854 destructor, typename. */
855 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
857 infile
, symbol
->printer_location
.first_line
,
865 fputs ("])\n\n", out
);
869 /*------------------------------------------------------------------.
870 | Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], |
871 | i.e., the information related to non defaulted GOTO on the nterm |
874 | DEFAULT_STATE is the principal destination on SYMBOL, i.e., the |
875 | default GOTO destination on SYMBOL. |
876 `------------------------------------------------------------------*/
879 save_column (symbol_number_t symbol
, state_number_t default_state
)
886 vector_number_t symno
= symbol_number_to_vector_number (symbol
);
888 goto_number_t begin
= goto_map
[symbol
];
889 goto_number_t end
= goto_map
[symbol
+ 1];
891 /* Number of non default GOTO. */
893 for (i
= begin
; i
< end
; i
++)
894 if (to_state
[i
] != default_state
)
900 /* Allocate room for non defaulted gotos. */
901 froms
[symno
] = sp1
= sp
= XCALLOC (base_t
, count
);
902 tos
[symno
] = sp2
= XCALLOC (base_t
, count
);
904 /* Store the state numbers of the non defaulted gotos. */
905 for (i
= begin
; i
< end
; i
++)
906 if (to_state
[i
] != default_state
)
908 *sp1
++ = from_state
[i
];
909 *sp2
++ = to_state
[i
];
912 tally
[symno
] = count
;
913 width
[symno
] = sp1
[-1] - sp
[0] + 1;
917 /*----------------------------------------------------------------.
918 | Return `the' most common destination GOTO on SYMBOL (a nterm). |
919 `----------------------------------------------------------------*/
921 static state_number_t
922 default_goto (symbol_number_t symbol
, short state_count
[])
926 goto_number_t m
= goto_map
[symbol
];
927 goto_number_t n
= goto_map
[symbol
+ 1];
928 state_number_t default_state
= (state_number_t
) -1;
932 return (state_number_t
) -1;
934 for (s
= 0; s
< nstates
; s
++)
937 for (i
= m
; i
< n
; i
++)
938 state_count
[to_state
[i
]]++;
940 for (s
= 0; s
< nstates
; s
++)
941 if (state_count
[s
] > max
)
943 max
= state_count
[s
];
947 return default_state
;
951 /*-------------------------------------------------------------------.
952 | Figure out what to do after reducing with each rule, depending on |
953 | the saved state from before the beginning of parsing the data that |
954 | matched this rule. |
956 | The YYDEFGOTO table is output now. The detailed info is saved for |
957 | putting into YYTABLE later. |
958 `-------------------------------------------------------------------*/
964 state_number_t
*yydefgoto
= XMALLOC (state_number_t
, nvars
);
966 /* For a given nterm I, STATE_COUNT[S] is the number of times there
967 is a GOTO to S on I. */
968 short *state_count
= XCALLOC (short, nstates
);
969 for (i
= ntokens
; i
< nsyms
; ++i
)
971 state_number_t default_state
= default_goto (i
, state_count
);
972 save_column (i
, default_state
);
973 yydefgoto
[i
- ntokens
] = default_state
;
976 muscle_insert_state_number_table ("defgoto", yydefgoto
,
977 yydefgoto
[0], 1, nsyms
- ntokens
);
983 /*------------------------------------------------------------------.
984 | Compute ORDER, a reordering of vectors, in order to decide how to |
985 | pack the actions and gotos information into yytable. |
986 `------------------------------------------------------------------*/
995 for (i
= 0; i
< nvectors
; i
++)
1001 int j
= nentries
- 1;
1003 while (j
>= 0 && (width
[order
[j
]] < w
))
1006 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
1009 for (k
= nentries
- 1; k
> j
; k
--)
1010 order
[k
+ 1] = order
[k
];
1018 /* If VECTOR is a state which actions (reflected by FROMS, TOS, TALLY
1019 and WIDTH of VECTOR) are common to a previous state, return this
1022 In any other case, return -1. */
1024 static state_number_t
1025 matching_state (vector_number_t vector
)
1027 vector_number_t i
= order
[vector
];
1032 /* If VECTOR is a nterm, return -1. */
1033 if (i
>= (int) nstates
)
1039 for (prev
= vector
- 1; prev
>= 0; prev
--)
1041 vector_number_t j
= order
[prev
];
1045 /* Given how ORDER was computed, if the WIDTH or TALLY is
1046 different, there cannot be a matching state. */
1047 if (width
[j
] != w
|| tally
[j
] != t
)
1050 for (k
= 0; match
&& k
< t
; k
++)
1051 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
1063 pack_vector (vector_number_t vector
)
1065 vector_number_t i
= order
[vector
];
1069 base_t
*from
= froms
[i
];
1070 base_t
*to
= tos
[i
];
1071 unsigned int *conflict_to
= conflict_tos
[i
];
1075 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
1080 for (k
= 0; ok
&& k
< t
; k
++)
1082 loc
= j
+ state_number_as_int (from
[k
]);
1083 if (loc
> (int) table_size
)
1086 if (table
[loc
] != 0)
1090 for (k
= 0; ok
&& k
< vector
; k
++)
1096 for (k
= 0; k
< t
; k
++)
1100 if (glr_parser
&& conflict_to
!= NULL
)
1101 conflict_table
[loc
] = conflict_to
[k
];
1102 check
[loc
] = from
[k
];
1105 while (table
[lowzero
] != 0)
1111 if (j
< BASE_MIN
|| BASE_MAX
< j
)
1112 fatal ("base_t too small to hold %d\n", j
);
1116 #define pack_vector_succeeded 0
1117 assert (pack_vector_succeeded
);
1122 /*-------------------------------------------------------------.
1123 | Remap the negative infinite in TAB from NINF to the greatest |
1124 | possible smallest value. Return it. |
1126 | In most case this allows us to use shorts instead of ints in |
1128 `-------------------------------------------------------------*/
1131 table_ninf_remap (base_t tab
[], size_t size
, base_t ninf
)
1136 for (i
= 0; i
< size
; i
++)
1137 if (tab
[i
] < res
&& tab
[i
] != ninf
)
1142 for (i
= 0; i
< size
; i
++)
1154 base
= XCALLOC (base_t
, nvectors
);
1155 pos
= XCALLOC (base_t
, nentries
);
1156 table
= XCALLOC (base_t
, table_size
);
1158 conflict_table
= XCALLOC (unsigned int, table_size
);
1159 check
= XCALLOC (base_t
, table_size
);
1164 for (i
= 0; i
< nvectors
; i
++)
1167 for (i
= 0; i
< (int) table_size
; i
++)
1170 for (i
= 0; i
< nentries
; i
++)
1172 state_number_t state
= matching_state (i
);
1176 /* A new set of state actions, or a nonterminal. */
1177 place
= pack_vector (i
);
1179 /* Action of I were already coded for STATE. */
1180 place
= base
[state
];
1183 base
[order
[i
]] = place
;
1186 /* Use the greatest possible negative infinites. */
1187 base_ninf
= table_ninf_remap (base
, nvectors
, BASE_MIN
);
1188 table_ninf
= table_ninf_remap (table
, high
+ 1, ACTION_MIN
);
1190 for (i
= 0; i
< nvectors
; i
++)
1194 XFREE (conflict_tos
[i
]);
1199 free (conflict_tos
);
1204 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1205 and the vectors whose elements index the portion starts. */
1211 muscle_insert_base_table ("pact", base
,
1212 base
[0], 1, nstates
);
1213 MUSCLE_INSERT_INT ("pact_ninf", base_ninf
);
1216 muscle_insert_base_table ("pgoto", base
,
1217 base
[nstates
], nstates
+ 1, nvectors
);
1225 muscle_insert_base_table ("table", table
,
1226 table
[0], 1, high
+ 1);
1227 MUSCLE_INSERT_INT ("table_ninf", table_ninf
);
1233 output_conflicts (void)
1235 /* GLR parsing slightly modifies yytable and yycheck
1236 (and thus yypact) so that in states with unresolved conflicts,
1237 the default reduction is not used in the conflicted entries, so
1238 that there is a place to put a conflict pointer. This means that
1239 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1240 avoid accidents by not writing them out in that case. */
1244 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
1245 conflict_table
[0], 1, high
+1);
1246 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
1247 conflict_list
[0], 1, conflict_list_cnt
);
1249 XFREE (conflict_table
);
1250 XFREE (conflict_list
);
1257 muscle_insert_base_table ("check", check
,
1258 check
[0], 1, high
+ 1);
1262 /*-----------------------------------------------------------------.
1263 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1265 `-----------------------------------------------------------------*/
1268 prepare_actions (void)
1270 /* That's a poor way to make sure the sizes are properly corelated,
1271 in particular the signedness is not taking into account, but it's
1273 assert (sizeof (nvectors
) >= sizeof (nstates
));
1274 assert (sizeof (nvectors
) >= sizeof (nvars
));
1276 nvectors
= state_number_as_int (nstates
) + nvars
;
1278 froms
= XCALLOC (base_t
*, nvectors
);
1279 tos
= XCALLOC (base_t
*, nvectors
);
1280 conflict_tos
= XCALLOC (unsigned int *, nvectors
);
1281 tally
= XCALLOC (short, nvectors
);
1282 width
= XCALLOC (base_t
, nvectors
);
1289 XFREE (goto_map
+ ntokens
);
1293 order
= XCALLOC (vector_number_t
, nvectors
);
1303 output_conflicts ();
1309 /*---------------------------.
1310 | Call the skeleton parser. |
1311 `---------------------------*/
1314 output_skeleton (void)
1316 /* Store the definition of all the muscles. */
1317 const char *tempdir
= getenv ("TMPDIR");
1318 char *tempfile
= NULL
;
1322 if (tempdir
== NULL
)
1323 tempdir
= DEFAULT_TMPDIR
;
1324 tempfile
= xmalloc (strlen (tempdir
) + 11);
1325 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1326 fd
= mkstemp (tempfile
);
1328 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1330 out
= fdopen (fd
, "w");
1332 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1334 /* There are no comments, especially not `#': we do want M4 expansion
1335 after `#': think of CPP macros! */
1336 fputs ("m4_changecom()\n", out
);
1337 fputs ("m4_init()\n", out
);
1339 actions_output (out
);
1340 merger_output (out
);
1341 token_definitions_output (out
);
1342 symbol_destructors_output (out
);
1343 symbol_printers_output (out
);
1345 muscles_m4_output (out
);
1347 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1348 fputs ("m4_divert_push(0)dnl\n", out
);
1351 m4_invoke (tempfile
);
1353 /* If `debugging', keep this file alive. */
1364 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1365 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1366 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1367 MUSCLE_INSERT_INT ("pure", pure_parser
);
1368 MUSCLE_INSERT_INT ("debug", debug_flag
);
1370 /* FIXME: This is wrong: the muscles should decide whether they hold
1371 a copy or not, but the situation is too obscure currently. */
1372 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1373 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1374 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1375 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1376 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1379 MUSCLE_INSERT_INT ("tokens_number", ntokens
);
1380 MUSCLE_INSERT_INT ("nterms_number", nvars
);
1381 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1382 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1385 MUSCLE_INSERT_INT ("rules_number", nrules
);
1388 MUSCLE_INSERT_INT ("last", high
);
1389 MUSCLE_INSERT_INT ("final_state_number", final_state
->number
);
1390 MUSCLE_INSERT_INT ("states_number", nstates
);
1393 obstack_1grow (&pre_prologue_obstack
, 0);
1394 obstack_1grow (&post_prologue_obstack
, 0);
1395 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1396 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1398 /* Find the right skeleton file. */
1404 skeleton
= "yacc.c";
1407 /* Parse the skeleton file and output the needed parsers. */
1408 muscle_insert ("skeleton", skeleton
);
1412 /*----------------------------------------------------------.
1413 | Output the parsing tables and the parser code to ftable. |
1414 `----------------------------------------------------------*/
1419 obstack_init (&format_obstack
);
1428 /* Process the selected skeleton file. */
1431 obstack_free (&format_obstack
, NULL
);
1432 obstack_free (&pre_prologue_obstack
, NULL
);
1433 obstack_free (&post_prologue_obstack
, NULL
);