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. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
30 ++ YYTNAME = vector of string-names indexed by bison token number.
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
35 YYRLINE = vector of line-numbers of all rules. For yydebug
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
41 YYPRHS[R] = index in YYRHS of first item for rule R.
43 YYR1[R] = symbol number of symbol that rule R derives.
45 YYR2[R] = number of symbols composing right hand side of rule R.
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
62 If the value in YYTABLE is positive, we shift the token and go to
65 If the value is negative, it is minus a rule number to reduce by.
67 If the value is zero, the default action from YYDEFACT[S] is used.
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
104 #include "conflicts.h"
105 #include "muscle_tab.h"
107 /* From lib/readpipe.h. */
108 FILE *readpipe
PARAMS ((const char *, ...));
110 /* From src/scan-skel.l. */
111 int skel_lex
PARAMS ((void));
112 extern FILE *skel_in
;
116 static short **froms
= NULL
;
117 static short **tos
= NULL
;
118 static unsigned int **conflict_tos
= NULL
;
119 static short *tally
= NULL
;
120 static short *width
= NULL
;
121 static short *actrow
= NULL
;
122 static short *conflrow
= NULL
;
123 static short *state_count
= NULL
;
124 static short *order
= NULL
;
125 static short *base
= NULL
;
126 static short *pos
= NULL
;
128 static unsigned int *conflict_table
= NULL
;
129 static unsigned int *conflict_list
= NULL
;
130 static int conflict_list_cnt
;
131 static int conflict_list_free
;
133 /* TABLE_SIZE is the allocated size of both TABLE and CHECK.
134 We start with the original hard-coded value: SHRT_MAX
135 (yes, not USHRT_MAX). */
136 static size_t table_size
= SHRT_MAX
;
137 static short *table
= NULL
;
138 static short *check
= NULL
;
142 static struct obstack format_obstack
;
144 int error_verbose
= 0;
147 /*----------------------------------------------------------------.
148 | If TABLE (and CHECK) appear to be small to be addressed at |
149 | DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
150 | the desired size is at least DESIRED + 1. |
151 `----------------------------------------------------------------*/
154 table_grow (size_t desired
)
156 size_t old_size
= table_size
;
158 while (table_size
<= desired
)
162 fprintf (stderr
, "growing table and check from: %d to %d\n",
163 old_size
, table_size
);
165 table
= XREALLOC (table
, short, table_size
);
166 check
= XREALLOC (check
, short, table_size
);
168 conflict_table
= XREALLOC (conflict_table
, unsigned int, table_size
);
170 for (/* Nothing. */; old_size
< table_size
; ++old_size
)
173 check
[old_size
] = -1;
178 /*-------------------------------------------------------------------.
179 | Create a function NAME which associates to the muscle NAME the |
180 | result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
181 | TYPE), and to the muscle NAME_max, the max value of the |
183 `-------------------------------------------------------------------*/
186 #define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
189 Name (const char *name, \
199 obstack_fgrow1 (&format_obstack, "%6d", first); \
200 for (i = begin; i < end; ++i) \
202 obstack_1grow (&format_obstack, ','); \
205 obstack_sgrow (&format_obstack, "\n "); \
210 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
211 if (table_data[i] > max) \
212 max = table_data[i]; \
214 obstack_1grow (&format_obstack, 0); \
215 muscle_insert (name, obstack_finish (&format_obstack)); \
217 /* Build `NAME_max' in the obstack. */ \
218 obstack_fgrow1 (&format_obstack, "%s_max", name); \
219 obstack_1grow (&format_obstack, 0); \
220 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), \
224 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table
, unsigned int)
225 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table
, short)
226 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table
, symbol_number_t
)
227 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table
, item_number_t
)
228 GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table
, state_number_t
)
231 /*-----------------------------------------------------------------.
232 | Prepare the muscles related to the tokens: translate, tname, and |
234 `-----------------------------------------------------------------*/
237 prepare_tokens (void)
239 muscle_insert_symbol_number_table ("translate",
241 0, 1, max_user_token_number
+ 1);
246 for (i
= 0; i
< nsyms
; i
++)
248 /* Be sure not to use twice the same QUOTEARG slot:
249 SYMBOL_TAG_GET uses slot 0. */
251 quotearg_n_style (1, c_quoting_style
,
253 /* Width of the next token, including the two quotes, the coma
255 int strsize
= strlen (cp
) + 2;
257 if (j
+ strsize
> 75)
259 obstack_sgrow (&format_obstack
, "\n ");
263 obstack_sgrow (&format_obstack
, cp
);
264 obstack_sgrow (&format_obstack
, ", ");
267 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
269 obstack_sgrow (&format_obstack
, "0");
271 /* Finish table and store. */
272 obstack_1grow (&format_obstack
, 0);
273 muscle_insert ("tname", obstack_finish (&format_obstack
));
276 /* Output YYTOKNUM. */
279 short *values
= XCALLOC (short, ntokens
+ 1);
280 for (i
= 0; i
< ntokens
+ 1; ++i
)
281 values
[i
] = symbols
[i
]->user_token_number
;
282 muscle_insert_short_table ("toknum", values
,
289 /*-------------------------------------------------------------.
290 | Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
291 | rline, dprec, merger |
292 `-------------------------------------------------------------*/
299 item_number_t
*rhs
= XMALLOC (item_number_t
, nritems
);
300 unsigned int *prhs
= XMALLOC (unsigned int, nrules
+ 1);
301 unsigned int *rline
= XMALLOC (unsigned int, nrules
+ 1);
302 symbol_number_t
*r1
= XMALLOC (symbol_number_t
, nrules
+ 1);
303 unsigned int *r2
= XMALLOC (unsigned int, nrules
+ 1);
304 short *dprec
= XMALLOC (short, nrules
+ 1);
305 short *merger
= XMALLOC (short, nrules
+ 1);
307 for (r
= 1; r
< nrules
+ 1; ++r
)
309 item_number_t
*rhsp
= NULL
;
310 /* Index of rule R in RHS. */
312 /* RHS of the rule R. */
313 for (rhsp
= rules
[r
].rhs
; *rhsp
>= 0; ++rhsp
)
315 /* LHS of the rule R. */
316 r1
[r
] = rules
[r
].lhs
->number
;
317 /* Length of rule R's RHS. */
319 /* Separator in RHS. */
321 /* Line where rule was defined. */
322 rline
[r
] = rules
[r
].location
.first_line
;
323 /* Dynamic precedence (GLR) */
324 dprec
[r
] = rules
[r
].dprec
;
325 /* Merger-function index (GLR) */
326 merger
[r
] = rules
[r
].merger
;
328 assert (i
== nritems
);
330 muscle_insert_item_number_table ("rhs", rhs
, ritem
[0], 1, nritems
);
331 muscle_insert_unsigned_int_table ("prhs", prhs
, 0, 1, nrules
+ 1);
332 muscle_insert_unsigned_int_table ("rline", rline
, 0, 1, nrules
+ 1);
333 muscle_insert_symbol_number_table ("r1", r1
, 0, 1, nrules
+ 1);
334 muscle_insert_unsigned_int_table ("r2", r2
, 0, 1, nrules
+ 1);
335 muscle_insert_short_table ("dprec", dprec
, 0, 1, nrules
+ 1);
336 muscle_insert_short_table ("merger", merger
, 0, 1, nrules
+ 1);
347 /*--------------------------------------------.
348 | Prepare the muscles related to the states. |
349 `--------------------------------------------*/
352 prepare_states (void)
355 symbol_number_t
*values
=
356 (symbol_number_t
*) alloca (sizeof (symbol_number_t
) * nstates
);
357 for (i
= 0; i
< nstates
; ++i
)
358 values
[i
] = states
[i
]->accessing_symbol
;
359 muscle_insert_symbol_number_table ("stos", values
,
364 /*-------------------------------------------------------------------.
365 | For GLR parsers, for each conflicted token in STATE, as indicated |
366 | by non-zero entries in conflrow, create a list of possible |
367 | reductions that are alternatives to the shift or reduction |
368 | currently recorded for that token in STATE. Store the alternative |
369 | reductions followed by a 0 in conflict_list, updating |
370 | conflict_list_cnt, and storing an index to the start of the list |
371 | back into conflrow. |
372 `-------------------------------------------------------------------*/
375 conflict_row (state_t
*state
)
382 for (j
= 0; j
< ntokens
; j
+= 1)
385 conflrow
[j
] = conflict_list_cnt
;
387 /* find all reductions for token j, and record all that do
388 * not match actrow[j] */
389 for (i
= 0; i
< state
->nlookaheads
; i
+= 1)
390 if (bitset_test (state
->lookaheads
[i
], j
)
391 && actrow
[j
] != -state
->lookaheads_rule
[i
]->number
)
393 assert (conflict_list_free
> 0);
394 conflict_list
[conflict_list_cnt
]
395 = state
->lookaheads_rule
[i
]->number
;
396 conflict_list_cnt
+= 1;
397 conflict_list_free
-= 1;
400 /* Leave a 0 at the end */
401 assert (conflict_list_free
> 0);
402 conflict_list_cnt
+= 1;
403 conflict_list_free
-= 1;
408 /*------------------------------------------------------------------.
409 | Decide what to do for each type of token if seen as the lookahead |
410 | token in specified state. The value returned is used as the |
411 | default action (yydefact) for the state. In addition, actrow is |
412 | filled with what to do for each kind of token, index by symbol |
413 | number, with zero meaning do the default action. The value |
414 | SHRT_MIN, a very negative number, means this situation is an |
415 | error. The parser recognizes this value specially. |
417 | This is where conflicts are resolved. The loop over lookahead |
418 | rules considered lower-numbered rules last, and the last rule |
419 | considered that likes a token gets to handle it. |
421 | For GLR parsers, also sets conflrow[SYM] to an index into |
422 | conflict_list iff there is an unresolved conflict (s/r or r/r) |
423 | with symbol SYM. The default reduction is not used for a symbol |
424 | that has any such conflicts. |
425 `------------------------------------------------------------------*/
428 action_row (state_t
*state
)
431 rule_number_t default_rule
= 0;
432 reductions_t
*redp
= state
->reductions
;
433 transitions_t
*transitions
= state
->shifts
;
434 errs_t
*errp
= state
->errs
;
435 /* set nonzero to inhibit having any default reduction */
439 for (i
= 0; i
< ntokens
; i
++)
440 actrow
[i
] = conflrow
[i
] = 0;
445 bitset_iterator biter
;
446 /* loop over all the rules available here which require
448 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
449 /* and find each token which the rule finds acceptable
451 BITSET_FOR_EACH (biter
, state
->lookaheads
[i
], j
, 0)
453 /* and record this rule as the rule to use if that
456 conflicted
= conflrow
[j
] = 1;
457 actrow
[j
] = -state
->lookaheads_rule
[i
]->number
;
461 /* Now see which tokens are allowed for shifts in this state. For
462 them, record the shift as the thing to do. So shift is preferred
464 for (i
= 0; i
< transitions
->num
&& TRANSITION_IS_SHIFT (transitions
, i
); i
++)
465 if (!TRANSITION_IS_DISABLED (transitions
, i
))
467 symbol_number_t symbol
= TRANSITION_SYMBOL (transitions
, i
);
468 state_number_t shift_state
= transitions
->states
[i
];
470 if (actrow
[symbol
] != 0)
471 conflicted
= conflrow
[symbol
] = 1;
472 actrow
[symbol
] = state_number_as_int (shift_state
);
474 /* Do not use any default reduction if there is a shift for
476 if (symbol
== errtoken
->number
)
480 /* See which tokens are an explicit error in this state (due to
481 %nonassoc). For them, record SHRT_MIN as the action. */
482 for (i
= 0; i
< errp
->num
; i
++)
484 symbol_number_t symbol
= errp
->symbols
[i
];
485 actrow
[symbol
] = SHRT_MIN
;
488 /* Now find the most common reduction and make it the default action
491 if (redp
->num
>= 1 && !nodefault
)
493 if (state
->consistent
)
494 default_rule
= redp
->rules
[0];
498 for (i
= 0; i
< state
->nlookaheads
; i
++)
501 rule_number_t rule
= state
->lookaheads_rule
[i
]->number
;
504 for (j
= 0; j
< ntokens
; j
++)
505 if (actrow
[j
] == -rule
)
515 /* GLR parsers need space for conflict lists, so we can't
516 default conflicted entries. For non-conflicted entries
517 or as long as we are not building a GLR parser,
518 actions that match the default are replaced with zero,
519 which means "use the default". */
524 for (j
= 0; j
< ntokens
; j
++)
525 if (actrow
[j
] == -default_rule
526 && ! (glr_parser
&& conflrow
[j
]))
532 /* If have no default rule, the default is an error.
533 So replace any action which says "error" with "use default". */
535 if (default_rule
== 0)
536 for (i
= 0; i
< ntokens
; i
++)
537 if (actrow
[i
] == SHRT_MIN
)
541 conflict_row (state
);
548 save_row (state_number_t state
)
555 unsigned int *sp3
= NULL
;
558 for (i
= 0; i
< ntokens
; i
++)
565 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
566 tos
[state
] = sp2
= XCALLOC (short, count
);
568 conflict_tos
[state
] = sp3
= XCALLOC (unsigned int, count
);
570 conflict_tos
[state
] = NULL
;
572 for (i
= 0; i
< ntokens
; i
++)
578 *sp3
++ = conflrow
[i
];
581 tally
[state
] = count
;
582 width
[state
] = sp1
[-1] - sp
[0] + 1;
586 /*------------------------------------------------------------------.
587 | Figure out the actions for the specified state, indexed by |
588 | lookahead token type. |
590 | The YYDEFACT table is output now. The detailed info is saved for |
591 | putting into YYTABLE later. |
592 `------------------------------------------------------------------*/
598 int nconflict
= conflicts_total_count ();
600 short *yydefact
= XCALLOC (short, nstates
);
602 actrow
= XCALLOC (short, ntokens
);
604 conflrow
= XCALLOC (short, ntokens
);
607 conflict_list
= XCALLOC (unsigned int, 1 + 2 * nconflict
);
608 conflict_list_free
= 2 * nconflict
;
609 conflict_list_cnt
= 1;
612 conflict_list_free
= conflict_list_cnt
= 0;
614 for (i
= 0; i
< nstates
; ++i
)
616 yydefact
[i
] = action_row (states
[i
]);
620 muscle_insert_short_table ("defact", yydefact
,
621 yydefact
[0], 1, nstates
);
628 /*-----------------------------.
629 | Output the actions to OOUT. |
630 `-----------------------------*/
633 actions_output (FILE *out
)
637 fputs ("m4_define([b4_actions], \n[[", out
);
638 for (r
= 1; r
< nrules
+ 1; ++r
)
641 fprintf (out
, " case %d:\n", r
);
644 fprintf (out
, muscle_find ("linef"),
645 rules
[r
].action_location
.first_line
,
646 quotearg_style (c_quoting_style
,
647 muscle_find ("filename")));
648 fprintf (out
, " %s\n break;\n\n",
651 fputs ("]])\n\n", out
);
654 /*--------------------------------------.
655 | Output the merge functions to OUT. |
656 `--------------------------------------*/
659 merger_output (FILE *out
)
664 fputs ("m4_define([b4_mergers], \n[[", out
);
665 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
667 if (p
->type
[0] == '\0')
668 fprintf (out
, " case %d: yyval = %s (*yy0, *yy1); break;\n",
671 fprintf (out
, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
672 n
, p
->type
, p
->name
);
674 fputs ("]])\n\n", out
);
677 /*---------------------------------------.
678 | Output the tokens definition to OOUT. |
679 `---------------------------------------*/
682 token_definitions_output (FILE *out
)
687 fputs ("m4_define([b4_tokens], \n[", out
);
688 for (i
= 0; i
< ntokens
; ++i
)
690 symbol_t
*symbol
= symbols
[i
];
691 int number
= symbol
->user_token_number
;
693 /* At this stage, if there are literal aliases, they are part of
694 SYMBOLS, so we should not find symbols which are the aliases
696 assert (number
!= USER_NUMBER_ALIAS
);
698 /* Skip error token. */
699 if (symbol
== errtoken
)
702 /* If this string has an alias, then it is necessarily the alias
703 which is to be output. */
705 symbol
= symbol
->alias
;
707 /* Don't output literal chars or strings (when defined only as a
708 string). Note that must be done after the alias resolution:
709 think about `%token 'f' "f"'. */
710 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
713 /* Don't #define nonliteral tokens whose names contain periods
714 or '$' (as does the default value of the EOF token). */
715 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
718 fprintf (out
, "%s[[[%s]], [%d]]",
719 first
? "" : ",\n", symbol
->tag
, number
);
723 fputs ("])\n\n", out
);
727 /*----------------------------------------.
728 | Output the symbol destructors to OOUT. |
729 `----------------------------------------*/
732 symbol_destructors_output (FILE *out
)
737 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
738 for (i
= 0; i
< nsyms
; ++i
)
739 if (symbols
[i
]->destructor
)
741 symbol_t
*symbol
= symbols
[i
];
744 Symbol-name, Symbol-number,
745 destructor, typename. */
746 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
748 infile
, symbol
->destructor_location
.first_line
,
756 fputs ("])\n\n", out
);
760 /*-------------------------------------.
761 | Output the symbol printers to OOUT. |
762 `-------------------------------------*/
765 symbol_printers_output (FILE *out
)
770 fputs ("m4_define([b4_symbol_printers], \n[", out
);
771 for (i
= 0; i
< nsyms
; ++i
)
772 if (symbols
[i
]->destructor
)
774 symbol_t
*symbol
= symbols
[i
];
777 Symbol-name, Symbol-number,
778 destructor, typename. */
779 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
781 infile
, symbol
->printer_location
.first_line
,
789 fputs ("])\n\n", out
);
794 save_column (symbol_number_t symbol
, state_number_t default_state
)
801 int symno
= symbol
- ntokens
+ state_number_as_int (nstates
);
803 int begin
= goto_map
[symbol
];
804 int end
= goto_map
[symbol
+ 1];
807 for (i
= begin
; i
< end
; i
++)
808 if (to_state
[i
] != default_state
)
814 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
815 tos
[symno
] = sp2
= XCALLOC (short, count
);
817 for (i
= begin
; i
< end
; i
++)
818 if (to_state
[i
] != default_state
)
820 *sp1
++ = from_state
[i
];
821 *sp2
++ = to_state
[i
];
824 tally
[symno
] = count
;
825 width
[symno
] = sp1
[-1] - sp
[0] + 1;
829 static state_number_t
830 default_goto (symbol_number_t symbol
)
834 int m
= goto_map
[symbol
];
835 int n
= goto_map
[symbol
+ 1];
836 state_number_t default_state
= (state_number_t
) -1;
840 return (state_number_t
) -1;
842 for (s
= 0; s
< nstates
; s
++)
845 for (i
= m
; i
< n
; i
++)
846 state_count
[to_state
[i
]]++;
848 for (s
= 0; s
< nstates
; s
++)
849 if (state_count
[s
] > max
)
851 max
= state_count
[s
];
855 return default_state
;
859 /*-------------------------------------------------------------------.
860 | Figure out what to do after reducing with each rule, depending on |
861 | the saved state from before the beginning of parsing the data that |
862 | matched this rule. |
864 | The YYDEFGOTO table is output now. The detailed info is saved for |
865 | putting into YYTABLE later. |
866 `-------------------------------------------------------------------*/
872 state_number_t
*yydefgoto
= XMALLOC (state_number_t
, nsyms
- ntokens
);
874 state_count
= XCALLOC (short, nstates
);
875 for (i
= ntokens
; i
< nsyms
; ++i
)
877 state_number_t default_state
= default_goto (i
);
878 save_column (i
, default_state
);
879 yydefgoto
[i
- ntokens
] = default_state
;
882 muscle_insert_state_number_table ("defgoto", yydefgoto
,
883 yydefgoto
[0], 1, nsyms
- ntokens
);
889 /* The next few functions decide how to pack the actions and gotos
890 information into yytable. */
897 order
= XCALLOC (short, nvectors
);
900 for (i
= 0; i
< nvectors
; i
++)
906 int j
= nentries
- 1;
908 while (j
>= 0 && (width
[order
[j
]] < w
))
911 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
914 for (k
= nentries
- 1; k
> j
; k
--)
915 order
[k
+ 1] = order
[k
];
924 matching_state (int vector
)
926 int i
= order
[vector
];
931 if (i
>= (int) nstates
)
937 for (prev
= vector
- 1; prev
>= 0; prev
--)
943 if (width
[j
] != w
|| tally
[j
] != t
)
946 for (k
= 0; match
&& k
< t
; k
++)
947 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
959 pack_vector (int vector
)
961 int i
= order
[vector
];
965 short *from
= froms
[i
];
967 unsigned int *conflict_to
= conflict_tos
[i
];
971 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
976 for (k
= 0; ok
&& k
< t
; k
++)
978 loc
= j
+ state_number_as_int (from
[k
]);
979 if (loc
> (int) table_size
)
986 for (k
= 0; ok
&& k
< vector
; k
++)
992 for (k
= 0; k
< t
; k
++)
994 loc
= j
+ state_number_as_int (from
[k
]);
995 table
[loc
] = state_number_as_int (to
[k
]);
996 if (glr_parser
&& conflict_to
!= NULL
)
997 conflict_table
[loc
] = conflict_to
[k
];
998 check
[loc
] = state_number_as_int (from
[k
]);
1001 while (table
[lowzero
] != 0)
1010 #define pack_vector_succeeded 0
1011 assert (pack_vector_succeeded
);
1023 base
= XCALLOC (short, nvectors
);
1024 pos
= XCALLOC (short, nentries
);
1025 table
= XCALLOC (short, table_size
);
1027 conflict_table
= XCALLOC (unsigned int, table_size
);
1028 check
= XCALLOC (short, table_size
);
1033 for (i
= 0; i
< nvectors
; i
++)
1036 for (i
= 0; i
< (int) table_size
; i
++)
1039 for (i
= 0; i
< nentries
; i
++)
1041 state
= matching_state (i
);
1044 place
= pack_vector (i
);
1046 place
= base
[state
];
1049 base
[order
[i
]] = place
;
1052 for (i
= 0; i
< nvectors
; i
++)
1056 XFREE (conflict_tos
[i
]);
1061 XFREE (conflict_tos
);
1065 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1066 and the vectors whose elements index the portion starts */
1072 muscle_insert_short_table ("pact", base
,
1073 base
[0], 1, nstates
);
1076 muscle_insert_short_table ("pgoto", base
,
1077 base
[nstates
], nstates
+ 1, nvectors
);
1085 muscle_insert_short_table ("table", table
,
1086 table
[0], 1, high
+ 1);
1092 output_conflicts (void)
1094 /* GLR parsing slightly modifies yytable and yycheck
1095 (and thus yypact) so that in states with unresolved conflicts,
1096 the default reduction is not used in the conflicted entries, so
1097 that there is a place to put a conflict pointer. This means that
1098 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1099 avoid accidents by not writing them out in that case. */
1103 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
1104 conflict_table
[0], 1, high
+1);
1105 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
1106 conflict_list
[0], 1, conflict_list_cnt
);
1108 XFREE (conflict_table
);
1109 XFREE (conflict_list
);
1116 muscle_insert_short_table ("check", check
,
1117 check
[0], 1, high
+ 1);
1121 /*-----------------------------------------------------------------.
1122 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1124 `-----------------------------------------------------------------*/
1127 output_actions (void)
1129 /* That's a poor way to make sure the sizes are properly corelated,
1130 in particular the signedness is not taking into account, but it's
1132 assert (sizeof (nvectors
) >= sizeof (nstates
));
1133 assert (sizeof (nvectors
) >= sizeof (nvars
));
1135 nvectors
= state_number_as_int (nstates
) + nvars
;
1137 froms
= XCALLOC (short *, nvectors
);
1138 tos
= XCALLOC (short *, nvectors
);
1139 conflict_tos
= XCALLOC (unsigned int *, nvectors
);
1140 tally
= XCALLOC (short, nvectors
);
1141 width
= XCALLOC (short, nvectors
);
1148 XFREE (goto_map
+ ntokens
);
1157 output_conflicts ();
1163 /*----------------------.
1164 | Run our backend, M4. |
1165 `----------------------*/
1168 m4_invoke (const char *definitions
)
1170 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1171 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1172 const char *m4
= getenv ("M4");
1174 char *full_skeleton
;
1178 if (!bison_pkgdatadir
)
1179 bison_pkgdatadir
= PKGDATADIR
;
1180 pkg_data_len
= strlen (bison_pkgdatadir
);
1181 full_skeleton
= XMALLOC (char, pkg_data_len
+ strlen (skeleton
) + 2);
1182 if (bison_pkgdatadir
[pkg_data_len
-1] == '/')
1183 sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
);
1185 sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
);
1188 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1189 m4
, bison_pkgdatadir
, definitions
, full_skeleton
);
1190 skel_in
= readpipe (m4
,
1191 "-I", bison_pkgdatadir
,
1192 "m4sugar/m4sugar.m4",
1196 XFREE (full_skeleton
);
1198 error (EXIT_FAILURE
, errno
, "cannot run m4");
1203 /*---------------------------.
1204 | Call the skeleton parser. |
1205 `---------------------------*/
1208 output_skeleton (void)
1210 /* Store the definition of all the muscles. */
1211 const char *tempdir
= getenv ("TMPDIR");
1212 char *tempfile
= NULL
;
1216 if (tempdir
== NULL
)
1217 tempdir
= DEFAULT_TMPDIR
;
1218 tempfile
= xmalloc (strlen (tempdir
) + 11);
1219 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1220 fd
= mkstemp (tempfile
);
1222 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1224 out
= fdopen (fd
, "w");
1226 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1228 /* There are no comments, especially not `#': we do want M4 expansion
1229 after `#': think of CPP macros! */
1230 fputs ("m4_changecom()\n", out
);
1231 fputs ("m4_init()\n", out
);
1233 actions_output (out
);
1234 merger_output (out
);
1235 token_definitions_output (out
);
1236 symbol_destructors_output (out
);
1237 symbol_printers_output (out
);
1239 muscles_m4_output (out
);
1241 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1242 fputs ("m4_divert_push(0)dnl\n", out
);
1245 m4_invoke (tempfile
);
1247 /* If `debugging', keep this file alive. */
1257 MUSCLE_INSERT_INT ("last", high
);
1258 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1259 MUSCLE_INSERT_INT ("pure", pure_parser
);
1260 MUSCLE_INSERT_INT ("nsym", nsyms
);
1261 MUSCLE_INSERT_INT ("debug", debug_flag
);
1262 MUSCLE_INSERT_INT ("final", final_state
->number
);
1263 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1264 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1265 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1266 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1268 /* FIXME: This is wrong: the muscles should decide whether they hold
1269 a copy or not, but the situation is too obscure currently. */
1270 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1271 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1272 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1273 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1275 MUSCLE_INSERT_INT ("nnts", nvars
);
1276 MUSCLE_INSERT_INT ("nrules", nrules
);
1277 MUSCLE_INSERT_INT ("nstates", nstates
);
1278 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1280 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1281 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1283 /* Copy definitions in directive. */
1284 obstack_1grow (&pre_prologue_obstack
, 0);
1285 obstack_1grow (&post_prologue_obstack
, 0);
1286 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1287 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1289 /* Find the right skeleton file. */
1295 skeleton
= "yacc.c";
1298 /* Parse the skeleton file and output the needed parsers. */
1299 muscle_insert ("skeleton", skeleton
);
1303 /*----------------------------------------------------------.
1304 | Output the parsing tables and the parser code to ftable. |
1305 `----------------------------------------------------------*/
1310 obstack_init (&format_obstack
);
1319 /* Process the selected skeleton file. */
1322 obstack_free (&format_obstack
, NULL
);
1323 obstack_free (&pre_prologue_obstack
, NULL
);
1324 obstack_free (&post_prologue_obstack
, NULL
);