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 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 /* 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 BITSET_EXECUTE (state
->lookaheads
[i
], 0, j
,
452 /* and record this rule as the rule to use if that
455 conflicted
= conflrow
[j
] = 1;
456 actrow
[j
] = -state
->lookaheads_rule
[i
]->number
;
460 /* Now see which tokens are allowed for shifts in this state. For
461 them, record the shift as the thing to do. So shift is preferred
463 for (i
= 0; i
< transitions
->num
&& TRANSITION_IS_SHIFT (transitions
, i
); i
++)
464 if (!TRANSITION_IS_DISABLED (transitions
, i
))
466 symbol_number_t symbol
= TRANSITION_SYMBOL (transitions
, i
);
467 state_number_t shift_state
= transitions
->states
[i
];
469 if (actrow
[symbol
] != 0)
470 conflicted
= conflrow
[symbol
] = 1;
471 actrow
[symbol
] = state_number_as_int (shift_state
);
473 /* Do not use any default reduction if there is a shift for
475 if (symbol
== errtoken
->number
)
479 /* See which tokens are an explicit error in this state (due to
480 %nonassoc). For them, record SHRT_MIN as the action. */
481 for (i
= 0; i
< errp
->num
; i
++)
483 symbol_number_t symbol
= errp
->symbols
[i
];
484 actrow
[symbol
] = SHRT_MIN
;
487 /* Now find the most common reduction and make it the default action
490 if (redp
->num
>= 1 && !nodefault
)
492 if (state
->consistent
)
493 default_rule
= redp
->rules
[0];
497 for (i
= 0; i
< state
->nlookaheads
; i
++)
500 rule_number_t rule
= state
->lookaheads_rule
[i
]->number
;
503 for (j
= 0; j
< ntokens
; j
++)
504 if (actrow
[j
] == -rule
)
514 /* GLR parsers need space for conflict lists, so we can't
515 default conflicted entries. For non-conflicted entries
516 or as long as we are not building a GLR parser,
517 actions that match the default are replaced with zero,
518 which means "use the default". */
523 for (j
= 0; j
< ntokens
; j
++)
524 if (actrow
[j
] == -default_rule
525 && ! (glr_parser
&& conflrow
[j
]))
531 /* If have no default rule, the default is an error.
532 So replace any action which says "error" with "use default". */
534 if (default_rule
== 0)
535 for (i
= 0; i
< ntokens
; i
++)
536 if (actrow
[i
] == SHRT_MIN
)
540 conflict_row (state
);
547 save_row (state_number_t state
)
554 unsigned int *sp3
= NULL
;
557 for (i
= 0; i
< ntokens
; i
++)
564 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
565 tos
[state
] = sp2
= XCALLOC (short, count
);
567 conflict_tos
[state
] = sp3
= XCALLOC (unsigned int, count
);
569 conflict_tos
[state
] = NULL
;
571 for (i
= 0; i
< ntokens
; i
++)
577 *sp3
++ = conflrow
[i
];
580 tally
[state
] = count
;
581 width
[state
] = sp1
[-1] - sp
[0] + 1;
585 /*------------------------------------------------------------------.
586 | Figure out the actions for the specified state, indexed by |
587 | lookahead token type. |
589 | The YYDEFACT table is output now. The detailed info is saved for |
590 | putting into YYTABLE later. |
591 `------------------------------------------------------------------*/
597 int nconflict
= conflicts_total_count ();
599 short *yydefact
= XCALLOC (short, nstates
);
601 actrow
= XCALLOC (short, ntokens
);
603 conflrow
= XCALLOC (short, ntokens
);
606 conflict_list
= XCALLOC (unsigned int, 1 + 2 * nconflict
);
607 conflict_list_free
= 2 * nconflict
;
608 conflict_list_cnt
= 1;
611 conflict_list_free
= conflict_list_cnt
= 0;
613 for (i
= 0; i
< nstates
; ++i
)
615 yydefact
[i
] = action_row (states
[i
]);
619 muscle_insert_short_table ("defact", yydefact
,
620 yydefact
[0], 1, nstates
);
627 /*-----------------------------.
628 | Output the actions to OOUT. |
629 `-----------------------------*/
632 actions_output (FILE *out
)
636 fputs ("m4_define([b4_actions], \n[[", out
);
637 for (r
= 1; r
< nrules
+ 1; ++r
)
640 fprintf (out
, " case %d:\n", r
);
643 fprintf (out
, muscle_find ("linef"),
644 rules
[r
].action_location
.first_line
,
645 quotearg_style (c_quoting_style
,
646 muscle_find ("filename")));
647 fprintf (out
, " %s\n break;\n\n",
650 fputs ("]])\n\n", out
);
653 /*--------------------------------------.
654 | Output the merge functions to OUT. |
655 `--------------------------------------*/
658 merger_output (FILE *out
)
663 fputs ("m4_define([b4_mergers], \n[[", out
);
664 for (n
= 1, p
= merge_functions
; p
!= NULL
; n
+= 1, p
= p
->next
)
666 if (p
->type
[0] == '\0')
667 fprintf (out
, " case %d: yyval = %s (*yy0, *yy1); break;\n",
670 fprintf (out
, " case %d: yyval.%s = %s (*yy0, *yy1); break;\n",
671 n
, p
->type
, p
->name
);
673 fputs ("]])\n\n", out
);
676 /*---------------------------------------.
677 | Output the tokens definition to OOUT. |
678 `---------------------------------------*/
681 token_definitions_output (FILE *out
)
686 fputs ("m4_define([b4_tokens], \n[", out
);
687 for (i
= 0; i
< ntokens
; ++i
)
689 symbol_t
*symbol
= symbols
[i
];
690 int number
= symbol
->user_token_number
;
692 /* At this stage, if there are literal aliases, they are part of
693 SYMBOLS, so we should not find symbols which are the aliases
695 assert (number
!= USER_NUMBER_ALIAS
);
697 /* Skip error token. */
698 if (symbol
== errtoken
)
701 /* If this string has an alias, then it is necessarily the alias
702 which is to be output. */
704 symbol
= symbol
->alias
;
706 /* Don't output literal chars or strings (when defined only as a
707 string). Note that must be done after the alias resolution:
708 think about `%token 'f' "f"'. */
709 if (symbol
->tag
[0] == '\'' || symbol
->tag
[0] == '\"')
712 /* Don't #define nonliteral tokens whose names contain periods
713 or '$' (as does the default value of the EOF token). */
714 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
717 fprintf (out
, "%s[[[%s]], [%d]]",
718 first
? "" : ",\n", symbol
->tag
, number
);
722 fputs ("])\n\n", out
);
726 /*----------------------------------------.
727 | Output the symbol destructors to OOUT. |
728 `----------------------------------------*/
731 symbol_destructors_output (FILE *out
)
736 fputs ("m4_define([b4_symbol_destructors], \n[", out
);
737 for (i
= 0; i
< nsyms
; ++i
)
738 if (symbols
[i
]->destructor
)
740 symbol_t
*symbol
= symbols
[i
];
743 Symbol-name, Symbol-number,
744 destructor, typename. */
745 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
747 infile
, symbol
->destructor_location
.first_line
,
748 symbol_tag_get (symbol
),
755 fputs ("])\n\n", out
);
759 /*-------------------------------------.
760 | Output the symbol printers to OOUT. |
761 `-------------------------------------*/
764 symbol_printers_output (FILE *out
)
769 fputs ("m4_define([b4_symbol_printers], \n[", out
);
770 for (i
= 0; i
< nsyms
; ++i
)
771 if (symbols
[i
]->destructor
)
773 symbol_t
*symbol
= symbols
[i
];
776 Symbol-name, Symbol-number,
777 destructor, typename. */
778 fprintf (out
, "%s[[[%s]], [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]",
780 infile
, symbol
->printer_location
.first_line
,
781 symbol_tag_get (symbol
),
788 fputs ("])\n\n", out
);
793 save_column (symbol_number_t symbol
, state_number_t default_state
)
800 int symno
= symbol
- ntokens
+ state_number_as_int (nstates
);
802 int begin
= goto_map
[symbol
];
803 int end
= goto_map
[symbol
+ 1];
806 for (i
= begin
; i
< end
; i
++)
807 if (to_state
[i
] != default_state
)
813 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
814 tos
[symno
] = sp2
= XCALLOC (short, count
);
816 for (i
= begin
; i
< end
; i
++)
817 if (to_state
[i
] != default_state
)
819 *sp1
++ = from_state
[i
];
820 *sp2
++ = to_state
[i
];
823 tally
[symno
] = count
;
824 width
[symno
] = sp1
[-1] - sp
[0] + 1;
828 static state_number_t
829 default_goto (symbol_number_t symbol
)
833 int m
= goto_map
[symbol
];
834 int n
= goto_map
[symbol
+ 1];
835 state_number_t default_state
= (state_number_t
) -1;
839 return (state_number_t
) -1;
841 for (s
= 0; s
< nstates
; s
++)
844 for (i
= m
; i
< n
; i
++)
845 state_count
[to_state
[i
]]++;
847 for (s
= 0; s
< nstates
; s
++)
848 if (state_count
[s
] > max
)
850 max
= state_count
[s
];
854 return default_state
;
858 /*-------------------------------------------------------------------.
859 | Figure out what to do after reducing with each rule, depending on |
860 | the saved state from before the beginning of parsing the data that |
861 | matched this rule. |
863 | The YYDEFGOTO table is output now. The detailed info is saved for |
864 | putting into YYTABLE later. |
865 `-------------------------------------------------------------------*/
871 state_number_t
*yydefgoto
= XMALLOC (state_number_t
, nsyms
- ntokens
);
873 state_count
= XCALLOC (short, nstates
);
874 for (i
= ntokens
; i
< nsyms
; ++i
)
876 state_number_t default_state
= default_goto (i
);
877 save_column (i
, default_state
);
878 yydefgoto
[i
- ntokens
] = default_state
;
881 muscle_insert_state_number_table ("defgoto", yydefgoto
,
882 yydefgoto
[0], 1, nsyms
- ntokens
);
888 /* The next few functions decide how to pack the actions and gotos
889 information into yytable. */
896 order
= XCALLOC (short, nvectors
);
899 for (i
= 0; i
< nvectors
; i
++)
905 int j
= nentries
- 1;
907 while (j
>= 0 && (width
[order
[j
]] < w
))
910 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
913 for (k
= nentries
- 1; k
> j
; k
--)
914 order
[k
+ 1] = order
[k
];
923 matching_state (int vector
)
925 int i
= order
[vector
];
930 if (i
>= (int) nstates
)
936 for (prev
= vector
- 1; prev
>= 0; prev
--)
942 if (width
[j
] != w
|| tally
[j
] != t
)
945 for (k
= 0; match
&& k
< t
; k
++)
946 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
958 pack_vector (int vector
)
960 int i
= order
[vector
];
964 short *from
= froms
[i
];
966 unsigned int *conflict_to
= conflict_tos
[i
];
970 for (j
= lowzero
- from
[0]; j
< (int) table_size
; j
++)
975 for (k
= 0; ok
&& k
< t
; k
++)
977 loc
= j
+ state_number_as_int (from
[k
]);
978 if (loc
> (int) table_size
)
985 for (k
= 0; ok
&& k
< vector
; k
++)
991 for (k
= 0; k
< t
; k
++)
993 loc
= j
+ state_number_as_int (from
[k
]);
994 table
[loc
] = state_number_as_int (to
[k
]);
995 if (glr_parser
&& conflict_to
!= NULL
)
996 conflict_table
[loc
] = conflict_to
[k
];
997 check
[loc
] = state_number_as_int (from
[k
]);
1000 while (table
[lowzero
] != 0)
1009 #define pack_vector_succeeded 0
1010 assert (pack_vector_succeeded
);
1022 base
= XCALLOC (short, nvectors
);
1023 pos
= XCALLOC (short, nentries
);
1024 table
= XCALLOC (short, table_size
);
1026 conflict_table
= XCALLOC (unsigned int, table_size
);
1027 check
= XCALLOC (short, table_size
);
1032 for (i
= 0; i
< nvectors
; i
++)
1035 for (i
= 0; i
< (int) table_size
; i
++)
1038 for (i
= 0; i
< nentries
; i
++)
1040 state
= matching_state (i
);
1043 place
= pack_vector (i
);
1045 place
= base
[state
];
1048 base
[order
[i
]] = place
;
1051 for (i
= 0; i
< nvectors
; i
++)
1055 XFREE (conflict_tos
[i
]);
1060 XFREE (conflict_tos
);
1064 /* the following functions output yytable, yycheck, yyconflp, yyconfl,
1065 and the vectors whose elements index the portion starts */
1071 muscle_insert_short_table ("pact", base
,
1072 base
[0], 1, nstates
);
1075 muscle_insert_short_table ("pgoto", base
,
1076 base
[nstates
], nstates
+ 1, nvectors
);
1084 muscle_insert_short_table ("table", table
,
1085 table
[0], 1, high
+ 1);
1091 output_conflicts (void)
1093 /* GLR parsing slightly modifies yytable and yycheck
1094 (and thus yypact) so that in states with unresolved conflicts,
1095 the default reduction is not used in the conflicted entries, so
1096 that there is a place to put a conflict pointer. This means that
1097 yyconflp and yyconfl are nonsense for a non-GLR parser, so we
1098 avoid accidents by not writing them out in that case. */
1102 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table
,
1103 conflict_table
[0], 1, high
+1);
1104 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list
,
1105 conflict_list
[0], 1, conflict_list_cnt
);
1107 XFREE (conflict_table
);
1108 XFREE (conflict_list
);
1115 muscle_insert_short_table ("check", check
,
1116 check
[0], 1, high
+ 1);
1120 /*-----------------------------------------------------------------.
1121 | Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
1123 `-----------------------------------------------------------------*/
1126 output_actions (void)
1128 /* That's a poor way to make sure the sizes are properly corelated,
1129 in particular the signedness is not taking into account, but it's
1131 assert (sizeof (nvectors
) >= sizeof (nstates
));
1132 assert (sizeof (nvectors
) >= sizeof (nvars
));
1134 nvectors
= state_number_as_int (nstates
) + nvars
;
1136 froms
= XCALLOC (short *, nvectors
);
1137 tos
= XCALLOC (short *, nvectors
);
1138 conflict_tos
= XCALLOC (unsigned int *, nvectors
);
1139 tally
= XCALLOC (short, nvectors
);
1140 width
= XCALLOC (short, nvectors
);
1147 XFREE (goto_map
+ ntokens
);
1156 output_conflicts ();
1162 /*----------------------.
1163 | Run our backend, M4. |
1164 `----------------------*/
1167 m4_invoke (const char *definitions
)
1169 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1170 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1171 const char *m4
= getenv ("M4");
1173 char *full_skeleton
;
1177 if (!bison_pkgdatadir
)
1178 bison_pkgdatadir
= PKGDATADIR
;
1179 pkg_data_len
= strlen (bison_pkgdatadir
);
1180 full_skeleton
= XMALLOC (char, pkg_data_len
+ strlen (skeleton
) + 2);
1181 if (bison_pkgdatadir
[pkg_data_len
-1] == '/')
1182 sprintf (full_skeleton
, "%s%s", bison_pkgdatadir
, skeleton
);
1184 sprintf (full_skeleton
, "%s/%s", bison_pkgdatadir
, skeleton
);
1187 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1188 m4
, bison_pkgdatadir
, definitions
, full_skeleton
);
1189 skel_in
= readpipe (m4
,
1190 "-I", bison_pkgdatadir
,
1191 "m4sugar/m4sugar.m4",
1195 XFREE (full_skeleton
);
1197 error (EXIT_FAILURE
, errno
, "cannot run m4");
1202 /*---------------------------.
1203 | Call the skeleton parser. |
1204 `---------------------------*/
1207 output_skeleton (void)
1209 /* Store the definition of all the muscles. */
1210 const char *tempdir
= getenv ("TMPDIR");
1211 char *tempfile
= NULL
;
1215 if (tempdir
== NULL
)
1216 tempdir
= DEFAULT_TMPDIR
;
1217 tempfile
= xmalloc (strlen (tempdir
) + 11);
1218 sprintf (tempfile
, "%s/bsnXXXXXX", tempdir
);
1219 fd
= mkstemp (tempfile
);
1221 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1223 out
= fdopen (fd
, "w");
1225 error (EXIT_FAILURE
, errno
, "%s", tempfile
);
1227 /* There are no comments, especially not `#': we do want M4 expansion
1228 after `#': think of CPP macros! */
1229 fputs ("m4_changecom()\n", out
);
1230 fputs ("m4_init()\n", out
);
1232 actions_output (out
);
1233 merger_output (out
);
1234 token_definitions_output (out
);
1235 symbol_destructors_output (out
);
1236 symbol_printers_output (out
);
1238 muscles_m4_output (out
);
1240 fputs ("m4_wrap([m4_divert_pop(0)])\n", out
);
1241 fputs ("m4_divert_push(0)dnl\n", out
);
1244 m4_invoke (tempfile
);
1246 /* If `debugging', keep this file alive. */
1256 MUSCLE_INSERT_INT ("last", high
);
1257 MUSCLE_INSERT_INT ("flag", SHRT_MIN
);
1258 MUSCLE_INSERT_INT ("pure", pure_parser
);
1259 MUSCLE_INSERT_INT ("nsym", nsyms
);
1260 MUSCLE_INSERT_INT ("debug", debug_flag
);
1261 MUSCLE_INSERT_INT ("final", final_state
->number
);
1262 MUSCLE_INSERT_INT ("undef_token_number", undeftoken
->number
);
1263 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number
);
1264 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1265 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1267 /* FIXME: This is wrong: the muscles should decide whether they hold
1268 a copy or not, but the situation is too obscure currently. */
1269 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1270 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1271 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1272 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1274 MUSCLE_INSERT_INT ("nnts", nvars
);
1275 MUSCLE_INSERT_INT ("nrules", nrules
);
1276 MUSCLE_INSERT_INT ("nstates", nstates
);
1277 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1279 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1280 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1282 /* Copy definitions in directive. */
1283 obstack_1grow (&pre_prologue_obstack
, 0);
1284 obstack_1grow (&post_prologue_obstack
, 0);
1285 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack
));
1286 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack
));
1288 /* Find the right skeleton file. */
1294 skeleton
= "yacc.c";
1297 /* Parse the skeleton file and output the needed parsers. */
1298 muscle_insert ("skeleton", skeleton
);
1302 /*----------------------------------------------------------.
1303 | Output the parsing tables and the parser code to ftable. |
1304 `----------------------------------------------------------*/
1309 obstack_init (&format_obstack
);
1318 /* Process the selected skeleton file. */
1321 obstack_free (&format_obstack
, NULL
);
1322 obstack_free (&pre_prologue_obstack
, NULL
);
1323 obstack_free (&post_prologue_obstack
, NULL
);