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
,
252 symbol_tag_get (symbols
[i
]));
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 shifts_t
*shiftp
= 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;
442 if (redp
->nreds
>= 1)
445 /* loop over all the rules available here which require
447 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
448 /* and find each token which the rule finds acceptable
450 for (j
= 0; j
< ntokens
; j
++)
451 /* and record this rule as the rule to use if that
453 if (bitset_test (state
->lookaheads
[i
], j
))
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
< shiftp
->nshifts
; i
++)
466 symbol_number_t symbol
;
467 state_number_t shift_state
= shiftp
->shifts
[i
];
471 symbol
= states
[shift_state
]->accessing_symbol
;
476 if (actrow
[symbol
] != 0)
477 conflicted
= conflrow
[symbol
] = 1;
478 actrow
[symbol
] = state_number_as_int (shift_state
);
480 /* Do not use any default reduction if there is a shift for
482 if (symbol
== errtoken
->number
)
486 /* See which tokens are an explicit error in this state (due to
487 %nonassoc). For them, record SHRT_MIN as the action. */
488 for (i
= 0; i
< errp
->nerrs
; i
++)
490 int symbol
= errp
->errs
[i
];
491 actrow
[symbol
] = SHRT_MIN
;
494 /* Now find the most common reduction and make it the default action
497 if (redp
->nreds
>= 1 && !nodefault
)
499 if (state
->consistent
)
500 default_rule
= redp
->rules
[0];
504 for (i
= 0; i
< state
->nlookaheads
; i
++)
507 rule_number_t rule
= -state
->lookaheads_rule
[i
]->number
;
510 for (j
= 0; j
< ntokens
; j
++)
511 if (actrow
[j
] == rule
)
521 /* GLR parsers need space for conflict lists, so we can't
522 default conflicted entries. For non-conflicted entries
523 or as long as we are not building a GLR parser,
524 actions that match the default are replaced with zero,
525 which means "use the default". */
530 for (j
= 0; j
< ntokens
; j
++)
531 if (actrow
[j
] == default_rule
&& ! (glr_parser
&& conflrow
[j
]))
534 default_rule
= -default_rule
;
538 /* If have no default rule, the default is an error.
539 So replace any action which says "error" with "use default". */
541 if (default_rule
== 0)
542 for (i
= 0; i
< ntokens
; i
++)
543 if (actrow
[i
] == SHRT_MIN
)
547 conflict_row (state
);
554 save_row (state_number_t state
)
561 unsigned int *sp3
= NULL
;
564 for (i
= 0; i
< ntokens
; i
++)
571 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
572 tos
[state
] = sp2
= XCALLOC (short, count
);
574 conflict_tos
[state
] = sp3
= XCALLOC (unsigned int, count
);
576 conflict_tos
[state
] = NULL
;
578 for (i
= 0; i
< ntokens
; i
++)
584 *sp3
++ = conflrow
[i
];
587 tally
[state
] = count
;
588 width
[state
] = sp1
[-1] - sp
[0] + 1;
592 /*------------------------------------------------------------------.
593 | Figure out the actions for the specified state, indexed by |
594 | lookahead token type. |
596 | The YYDEFACT table is output now. The detailed info is saved for |
597 | putting into YYTABLE later. |
598 `------------------------------------------------------------------*/
604 int nconflict
= conflicts_total_count ();
606 short *yydefact
= XCALLOC (short, nstates
);
608 actrow
= XCALLOC (short, ntokens
);
610 conflrow
= XCALLOC (short, ntokens
);
613 conflict_list
= XCALLOC (unsigned int, 1 + 2 * nconflict
);
614 conflict_list_free
= 2 * nconflict
;
615 conflict_list_cnt
= 1;
618 conflict_list_free
= conflict_list_cnt
= 0;
620 for (i
= 0; i
< nstates
; ++i
)
622 yydefact
[i
] = action_row (states
[i
]);
626 muscle_insert_short_table ("defact", yydefact
,
627 yydefact
[0], 1, nstates
);
634 /*-----------------------------.
635 | Output the actions to OOUT. |
636 `-----------------------------*/
639 actions_output (FILE *out
)
643 fputs ("m4_define([b4_actions], \n[[", out
);
644 for (r
= 1; r
< nrules
+ 1; ++r
)
647 fprintf (out
, " case %d:\n", r
);
650 fprintf (out
, muscle_find ("linef"),
651 rules
[r
].action_location
.first_line
,
652 quotearg_style (c_quoting_style
,
653 muscle_find ("filename")));
654 fprintf (out
, " %s\n break;\n\n",
657 fputs ("]])\n\n", out
);
660 /*--------------------------------------.
661 | Output the merge functions to OUT. |
662 `--------------------------------------*/
665 merger_output (FILE *out
)
670 fputs ("m4_define([b4_mergers], \n[[", out
);
671 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
673 if (p
->type
[0] == '\0')
674 fprintf (out
, " case %d: yyval = %s (*yy0, *yy1); break;\n",
677 fprintf (out
, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
678 n
, p
->type
, p
->name
);
680 fputs ("]])\n\n", out
);
683 /*---------------------------------------.
684 | Output the tokens definition to OOUT. |
685 `---------------------------------------*/
688 token_definitions_output (FILE *out
)
693 fputs ("m4_define([b4_tokens], \n[", out
);
694 for (i
= 0; i
< ntokens
; ++i
)
696 symbol_t
*symbol
= symbols
[i
];
697 int number
= symbol
->user_token_number
;
699 /* At this stage, if there are literal aliases, they are part of
700 SYMBOLS, so we should not find symbols which are the aliases
702 assert (number
!= USER_NUMBER_ALIAS
);
704 /* Skip error token. */
705 if (symbol
== errtoken
)
708 /* If this string has an alias, then it is necessarily the alias
709 which is to be output. */
711 symbol
= symbol
->alias
;
713 /* Don't output literal chars or strings (when defined only as a
714 string). Note that must be done after the alias resolution:
715 think about `%token 'f' "f"'. */
716 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
719 /* Don't #define nonliteral tokens whose names contain periods
720 or '$' (as does the default value of the EOF token). */
721 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
724 fprintf (out
, "%s[[[%s]], [%d]]",
725 first
? "" : ",\n", symbol
->tag
, number
);
729 fputs ("])\n\n", out
);
733 /*----------------------------------------.
734 | Output the symbol destructors to OOUT. |
735 `----------------------------------------*/
738 symbol_destructors_output (FILE *out
)
743 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
744 for (i
= 0; i
< nsyms
; ++i
)
745 if (symbols
[i
]->destructor
)
747 symbol_t
*symbol
= symbols
[i
];
750 Symbol-name, Symbol-number,
751 destructor, typename. */
752 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
754 infile
, symbol
->destructor_location
.first_line
,
755 symbol_tag_get (symbol
),
762 fputs ("])\n\n", out
);
766 /*-------------------------------------.
767 | Output the symbol printers to OOUT. |
768 `-------------------------------------*/
771 symbol_printers_output (FILE *out
)
776 fputs ("m4_define([b4_symbol_printers], \n[", out
);
777 for (i
= 0; i
< nsyms
; ++i
)
778 if (symbols
[i
]->destructor
)
780 symbol_t
*symbol
= symbols
[i
];
783 Symbol-name, Symbol-number,
784 destructor, typename. */
785 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
787 infile
, symbol
->printer_location
.first_line
,
788 symbol_tag_get (symbol
),
795 fputs ("])\n\n", out
);
800 save_column (symbol_number_t symbol
, state_number_t default_state
)
807 int symno
= symbol
- ntokens
+ state_number_as_int (nstates
);
809 int begin
= goto_map
[symbol
];
810 int end
= goto_map
[symbol
+ 1];
813 for (i
= begin
; i
< end
; i
++)
814 if (to_state
[i
] != default_state
)
820 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
821 tos
[symno
] = sp2
= XCALLOC (short, count
);
823 for (i
= begin
; i
< end
; i
++)
824 if (to_state
[i
] != default_state
)
826 *sp1
++ = from_state
[i
];
827 *sp2
++ = to_state
[i
];
830 tally
[symno
] = count
;
831 width
[symno
] = sp1
[-1] - sp
[0] + 1;
835 static state_number_t
836 default_goto (symbol_number_t symbol
)
840 int m
= goto_map
[symbol
];
841 int n
= goto_map
[symbol
+ 1];
842 state_number_t default_state
= (state_number_t
) -1;
846 return (state_number_t
) -1;
848 for (s
= 0; s
< nstates
; s
++)
851 for (i
= m
; i
< n
; i
++)
852 state_count
[to_state
[i
]]++;
854 for (s
= 0; s
< nstates
; s
++)
855 if (state_count
[s
] > max
)
857 max
= state_count
[s
];
861 return default_state
;
865 /*-------------------------------------------------------------------.
866 | Figure out what to do after reducing with each rule, depending on |
867 | the saved state from before the beginning of parsing the data that |
868 | matched this rule. |
870 | The YYDEFGOTO table is output now. The detailed info is saved for |
871 | putting into YYTABLE later. |
872 `-------------------------------------------------------------------*/
878 state_number_t
*yydefgoto
= XMALLOC (state_number_t
, nsyms
- ntokens
);
880 state_count
= XCALLOC (short, nstates
);
881 for (i
= ntokens
; i
< nsyms
; ++i
)
883 state_number_t default_state
= default_goto (i
);
884 save_column (i
, default_state
);
885 yydefgoto
[i
- ntokens
] = default_state
;
888 muscle_insert_state_number_table ("defgoto", yydefgoto
,
889 yydefgoto
[0], 1, nsyms
- ntokens
);
895 /* The next few functions decide how to pack the actions and gotos
896 information into yytable. */
903 order
= XCALLOC (short, nvectors
);
906 for (i
= 0; i
< nvectors
; i
++)
912 int j
= nentries
- 1;
914 while (j
>= 0 && (width
[order
[j
]] < w
))
917 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
920 for (k
= nentries
- 1; k
> j
; k
--)
921 order
[k
+ 1] = order
[k
];
930 matching_state (int vector
)
932 int i
= order
[vector
];
937 if (i
>= (int) nstates
)
943 for (prev
= vector
- 1; prev
>= 0; prev
--)
949 if (width
[j
] != w
|| tally
[j
] != t
)
952 for (k
= 0; match
&& k
< t
; k
++)
953 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
965 pack_vector (int vector
)
967 int i
= order
[vector
];
971 short *from
= froms
[i
];
973 unsigned int *conflict_to
= conflict_tos
[i
];
977 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
982 for (k
= 0; ok
&& k
< t
; k
++)
984 loc
= j
+ state_number_as_int (from
[k
]);
985 if (loc
> (int) table_size
)
992 for (k
= 0; ok
&& k
< vector
; k
++)
998 for (k
= 0; k
< t
; k
++)
1000 loc
= j
+ state_number_as_int (from
[k
]);
1001 table
[loc
] = state_number_as_int (to
[k
]);
1002 if (glr_parser
&& conflict_to
!= NULL
)
1003 conflict_table
[loc
] = conflict_to
[k
];
1004 check
[loc
] = state_number_as_int (from
[k
]);
1007 while (table
[lowzero
] != 0)
1016 #define pack_vector_succeeded 0
1017 assert (pack_vector_succeeded
);
1029 base
= XCALLOC (short, nvectors
);
1030 pos
= XCALLOC (short, nentries
);
1031 table
= XCALLOC (short, table_size
);
1033 conflict_table
= XCALLOC (unsigned int, table_size
);
1034 check
= XCALLOC (short, table_size
);
1039 for (i
= 0; i
< nvectors
; i
++)
1042 for (i
= 0; i
< (int) table_size
; i
++)
1045 for (i
= 0; i
< nentries
; i
++)
1047 state
= matching_state (i
);
1050 place
= pack_vector (i
);
1052 place
= base
[state
];
1055 base
[order
[i
]] = place
;
1058 for (i
= 0; i
< nvectors
; i
++)
1062 XFREE (conflict_tos
[i
]);
1067 XFREE (conflict_tos
);
1071 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1072 and the vectors whose elements index the portion starts */
1078 muscle_insert_short_table ("pact", base
,
1079 base
[0], 1, nstates
);
1082 muscle_insert_short_table ("pgoto", base
,
1083 base
[nstates
], nstates
+ 1, nvectors
);
1091 muscle_insert_short_table ("table", table
,
1092 table
[0], 1, high
+ 1);
1098 output_conflicts (void)
1100 /* GLR parsing slightly modifies yytable and yycheck
1101 (and thus yypact) so that in states with unresolved conflicts,
1102 the default reduction is not used in the conflicted entries, so
1103 that there is a place to put a conflict pointer. This means that
1104 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1105 avoid accidents by not writing them out in that case. */
1109 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
1110 conflict_table
[0], 1, high
+1);
1111 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
1112 conflict_list
[0], 1, conflict_list_cnt
);
1114 XFREE (conflict_table
);
1115 XFREE (conflict_list
);
1122 muscle_insert_short_table ("check", check
,
1123 check
[0], 1, high
+ 1);
1127 /*-----------------------------------------------------------------.
1128 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1130 `-----------------------------------------------------------------*/
1133 output_actions (void)
1135 /* That's a poor way to make sure the sizes are properly corelated,
1136 in particular the signedness is not taking into account, but it's
1138 assert (sizeof (nvectors
) >= sizeof (nstates
));
1139 assert (sizeof (nvectors
) >= sizeof (nvars
));
1141 nvectors
= state_number_as_int (nstates
) + nvars
;
1143 froms
= XCALLOC (short *, nvectors
);
1144 tos
= XCALLOC (short *, nvectors
);
1145 conflict_tos
= XCALLOC (unsigned int *, nvectors
);
1146 tally
= XCALLOC (short, nvectors
);
1147 width
= XCALLOC (short, nvectors
);
1154 XFREE (goto_map
+ ntokens
);
1163 output_conflicts ();
1169 /*----------------------.
1170 | Run our backend, M4. |
1171 `----------------------*/
1174 m4_invoke (const char *definitions
)
1176 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1177 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1178 const char *m4
= getenv ("M4");
1180 char *full_skeleton
;
1184 if (!bison_pkgdatadir
)
1185 bison_pkgdatadir
= PKGDATADIR
;
1186 pkg_data_len
= strlen (bison_pkgdatadir
);
1187 full_skeleton
= XMALLOC (char, pkg_data_len
+ strlen (skeleton
) + 2);
1188 if (bison_pkgdatadir
[pkg_data_len
-1] == '/')
1189 sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
);
1191 sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
);
1194 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1195 m4
, bison_pkgdatadir
, definitions
, full_skeleton
);
1196 skel_in
= readpipe (m4
,
1197 "-I", bison_pkgdatadir
,
1198 "m4sugar/m4sugar.m4",
1202 XFREE (full_skeleton
);
1204 error (EXIT_FAILURE
, errno
, "cannot run m4");
1209 /*---------------------------.
1210 | Call the skeleton parser. |
1211 `---------------------------*/
1214 output_skeleton (void)
1216 /* Store the definition of all the muscles. */
1217 const char *tempdir
= getenv ("TMPDIR");
1218 char *tempfile
= NULL
;
1222 if (tempdir
== NULL
)
1223 tempdir
= DEFAULT_TMPDIR
;
1224 tempfile
= xmalloc (strlen (tempdir
) + 11);
1225 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1226 fd
= mkstemp (tempfile
);
1228 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1230 out
= fdopen (fd
, "w");
1232 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1234 /* There are no comments, especially not `#': we do want M4 expansion
1235 after `#': think of CPP macros! */
1236 fputs ("m4_changecom()\n", out
);
1237 fputs ("m4_init()\n", out
);
1239 actions_output (out
);
1240 merger_output (out
);
1241 token_definitions_output (out
);
1242 symbol_destructors_output (out
);
1243 symbol_printers_output (out
);
1245 muscles_m4_output (out
);
1247 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1248 fputs ("m4_divert_push(0)dnl\n", out
);
1251 m4_invoke (tempfile
);
1253 /* If `debugging', keep this file alive. */
1263 MUSCLE_INSERT_INT ("last", high
);
1264 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1265 MUSCLE_INSERT_INT ("pure", pure_parser
);
1266 MUSCLE_INSERT_INT ("nsym", nsyms
);
1267 MUSCLE_INSERT_INT ("debug", debug_flag
);
1268 MUSCLE_INSERT_INT ("final", final_state
->number
);
1269 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1270 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1271 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1272 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1274 /* FIXME: This is wrong: the muscles should decide whether they hold
1275 a copy or not, but the situation is too obscure currently. */
1276 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1277 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1278 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1279 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1281 MUSCLE_INSERT_INT ("nnts", nvars
);
1282 MUSCLE_INSERT_INT ("nrules", nrules
);
1283 MUSCLE_INSERT_INT ("nstates", nstates
);
1284 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1286 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1287 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1289 /* Copy definitions in directive. */
1290 obstack_1grow (&pre_prologue_obstack
, 0);
1291 obstack_1grow (&post_prologue_obstack
, 0);
1292 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1293 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1295 /* Find the right skeleton file. */
1301 skeleton
= "yacc.c";
1304 /* Parse the skeleton file and output the needed parsers. */
1305 muscle_insert ("skeleton", skeleton
);
1309 /*----------------------------------------------------------.
1310 | Output the parsing tables and the parser code to ftable. |
1311 `----------------------------------------------------------*/
1316 obstack_init (&format_obstack
);
1325 /* Process the selected skeleton file. */
1328 obstack_free (&format_obstack
, NULL
);
1329 obstack_free (&pre_prologue_obstack
, NULL
);
1330 obstack_free (&post_prologue_obstack
, NULL
);