]> git.saurik.com Git - bison.git/blame - src/output.c
* src/output.c (GENERATE_OUTPUT_TABLE): Replace with...
[bison.git] / src / output.c
CommitLineData
c3e23647 1/* Output the generated parsing program for bison,
5bb18f9a 2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
255ef638 3 Free Software Foundation, Inc.
c3e23647 4
9ee3c97b 5 This file is part of Bison, the GNU Compiler Compiler.
c3e23647 6
9ee3c97b
AD
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)
10 any later version.
c3e23647 11
9ee3c97b
AD
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.
c3e23647 16
9ee3c97b
AD
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
20 02111-1307, USA. */
c3e23647
RS
21
22
255ef638
AD
23/* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
25 are set.
c3e23647 26
255ef638
AD
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
c3e23647 29
255ef638 30 ++ YYTNAME = vector of string-names indexed by bison token number.
c3e23647 31
255ef638
AD
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
c3e23647 34
255ef638
AD
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
c3e23647 37
255ef638
AD
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
c3e23647 40
255ef638 41 YYPRHS[R] = index in YYRHS of first item for rule R.
c3e23647 42
255ef638 43 YYR1[R] = symbol number of symbol that rule R derives.
c3e23647 44
255ef638 45 YYR2[R] = number of symbols composing right hand side of rule R.
c3e23647 46
255ef638
AD
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
e372befa 49
255ef638
AD
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
52 error.
c3e23647 53
255ef638
AD
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
56 something else to do.
c3e23647 57
255ef638
AD
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
60 out what to do.
c3e23647 61
255ef638
AD
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
c3e23647 64
6c89f1c1 65 If the value is negative, it is minus a rule number to reduce by.
c3e23647 66
255ef638
AD
67 If the value is zero, the default action from YYDEFACT[S] is used.
68
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.
74
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
77
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
80 examine.
81
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.
87
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
c3e23647 90
c3e23647 91#include "system.h"
914feea9 92#include "bitsetv.h"
14d3eb9b 93#include "quotearg.h"
be2a1a68 94#include "error.h"
ceed8467 95#include "getargs.h"
c3e23647
RS
96#include "files.h"
97#include "gram.h"
b2ca4022 98#include "LR0.h"
a0f6b076 99#include "complain.h"
6c89f1c1 100#include "output.h"
720d742f 101#include "lalr.h"
a70083a3 102#include "reader.h"
ad949da9 103#include "symtab.h"
0619caf0 104#include "conflicts.h"
11d82f03 105#include "muscle_tab.h"
be2a1a68
AD
106
107/* From lib/readpipe.h. */
108FILE *readpipe PARAMS ((const char *, ...));
109
110/* From src/scan-skel.l. */
111int skel_lex PARAMS ((void));
112extern FILE *skel_in;
d019d655 113
c3e23647
RS
114static int nvectors;
115static int nentries;
342b8b6e
AD
116static short **froms = NULL;
117static short **tos = NULL;
118static short *tally = NULL;
119static short *width = NULL;
120static short *actrow = NULL;
121static short *state_count = NULL;
122static short *order = NULL;
123static short *base = NULL;
124static short *pos = NULL;
133c20e2
AD
125
126/* TABLE_SIZE is the allocated size of both TABLE and CHECK.
127 We start with the original hard-coded value: SHRT_MAX
128 (yes, not USHRT_MAX). */
129static size_t table_size = SHRT_MAX;
342b8b6e
AD
130static short *table = NULL;
131static short *check = NULL;
c3e23647
RS
132static int lowzero;
133static int high;
134
11d82f03 135struct obstack muscle_obstack;
f87685c3 136static struct obstack format_obstack;
c3e23647 137
c7925b99
MA
138int error_verbose = 0;
139
f0440388 140
133c20e2
AD
141/*----------------------------------------------------------------.
142| If TABLE (and CHECK) appear to be small to be addressed at |
143| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so |
144| the desired size is at least DESIRED + 1. |
145`----------------------------------------------------------------*/
146
147static void
148table_grow (size_t desired)
149{
150 size_t old_size = table_size;
151
152 while (table_size <= desired)
153 table_size *= 2;
154
155 if (trace_flag)
156 fprintf (stderr, "growing table and check from: %d to %d\n",
157 old_size, table_size);
158
159 table = XREALLOC (table, short, table_size);
160 check = XREALLOC (check, short, table_size);
161
162 for (/* Nothing. */; old_size < table_size; ++old_size)
163 {
164 table[old_size] = 0;
165 check[old_size] = -1;
166 }
167}
168
169
5372019f
AD
170/*-------------------------------------------------------------------.
171| Create a function NAME which associates to the muscle NAME the |
172| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
173| TYPE), and to the muscle NAME_max, the max value of the |
174| TABLE_DATA. |
175`-------------------------------------------------------------------*/
62a3e4f0 176
62a3e4f0 177
5372019f 178#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 179 \
5372019f
AD
180static void \
181Name (const char *name, \
5fbb0954
AD
182 Type *table_data, \
183 Type first, \
184 int begin, \
185 int end) \
186{ \
187 long int max = first; \
188 int i; \
189 int j = 1; \
190 \
5372019f 191 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
192 for (i = begin; i < end; ++i) \
193 { \
5372019f 194 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
195 if (j >= 10) \
196 { \
5372019f 197 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
198 j = 1; \
199 } \
200 else \
201 ++j; \
5372019f 202 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
5fbb0954
AD
203 if (table_data[i] > max) \
204 max = table_data[i]; \
205 } \
5372019f
AD
206 obstack_1grow (&format_obstack, 0); \
207 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 208 \
5372019f
AD
209 /* Build `NAME_max' in the obstack. */ \
210 obstack_fgrow1 (&format_obstack, "%s_max", name); \
211 obstack_1grow (&format_obstack, 0); \
212 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), max); \
62a3e4f0
AD
213}
214
5372019f
AD
215GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int)
216GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
217GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_table, short)
218GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_token_number_table, token_number_t)
219GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number_t)
c3e23647
RS
220
221
b0940840
AD
222/*-----------------------------------------------------------------.
223| Prepare the muscles related to the tokens: translate, tname, and |
224| toknum. |
225`-----------------------------------------------------------------*/
226
4a120d45 227static void
b0940840 228prepare_tokens (void)
c3e23647 229{
5372019f
AD
230 muscle_insert_token_number_table ("translate",
231 token_translations,
232 0, 1, max_user_token_number + 1);
c3e23647 233
b0940840
AD
234 {
235 int i;
236 int j = 0;
237 for (i = 0; i < nsyms; i++)
238 {
239 /* Be sure not to use twice the same quotearg slot. */
240 const char *cp =
241 quotearg_n_style (1, c_quoting_style,
242 quotearg_style (escape_quoting_style,
243 symbols[i]->tag));
244 /* Width of the next token, including the two quotes, the coma
245 and the space. */
246 int strsize = strlen (cp) + 2;
247
248 if (j + strsize > 75)
249 {
250 obstack_sgrow (&format_obstack, "\n ");
251 j = 2;
252 }
253
254 obstack_sgrow (&format_obstack, cp);
255 obstack_sgrow (&format_obstack, ", ");
256 j += strsize;
257 }
258 /* Add a NULL entry to list of tokens (well, 0, as NULL might not be
259 defined). */
260 obstack_sgrow (&format_obstack, "0");
c3e23647 261
b0940840
AD
262 /* Finish table and store. */
263 obstack_1grow (&format_obstack, 0);
264 muscle_insert ("tname", obstack_finish (&format_obstack));
265 }
266
267 /* Output YYTOKNUM. */
b2ed6e58
AD
268 {
269 int i;
b0940840
AD
270 short *values = XCALLOC (short, ntokens + 1);
271 for (i = 0; i < ntokens + 1; ++i)
272 values[i] = symbols[i]->user_token_number;
5372019f
AD
273 muscle_insert_short_table ("toknum", values,
274 0, 1, ntokens + 1);
b0940840 275 free (values);
b2ed6e58 276 }
b0940840 277}
b2ed6e58 278
b0940840
AD
279
280/*-------------------------------------------------------------.
281| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
282| rline. |
283`-------------------------------------------------------------*/
284
285static void
286prepare_rules (void)
287{
62a3e4f0 288 long int max;
b0940840 289 int r;
5df5f6d5 290 unsigned int i = 0;
62a3e4f0 291 item_number_t *rhs = XMALLOC (item_number_t, nritems);
5df5f6d5
AD
292 unsigned int *prhs = XMALLOC (unsigned int, nrules + 1);
293 unsigned int *rline = XMALLOC (unsigned int, nrules + 1);
5fbb0954 294 token_number_t *r1 = XMALLOC (token_number_t, nrules + 1);
5df5f6d5 295 unsigned int *r2 = XMALLOC (unsigned int, nrules + 1);
b0940840
AD
296
297 for (r = 1; r < nrules + 1; ++r)
298 {
5df5f6d5 299 item_number_t *rhsp;
b0940840
AD
300 /* Index of rule R in RHS. */
301 prhs[r] = i;
302 /* RHS of the rule R. */
303 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
304 rhs[i++] = *rhsp;
305 /* LHS of the rule R. */
306 r1[r] = rules[r].lhs->number;
307 /* Length of rule R's RHS. */
308 r2[r] = i - prhs[r];
309 /* Separator in RHS. */
310 rhs[i++] = -1;
311 /* Line where rule was defined. */
312 rline[r] = rules[r].line;
313 }
314 assert (i == nritems);
315
5372019f
AD
316 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
317 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 1, nrules + 1);
318 muscle_insert_unsigned_int_table ("rline", rline, 0, 1, nrules + 1);
319 muscle_insert_token_number_table ("r1", r1, 0, 1, nrules + 1);
320 muscle_insert_unsigned_int_table ("r2", r2, 0, 1, nrules + 1);
796d61fb 321
b0940840
AD
322 free (rhs);
323 free (prhs);
5df5f6d5
AD
324 free (rline);
325 free (r1);
b0940840 326 free (r2);
c3e23647
RS
327}
328
b0940840
AD
329/*--------------------------------------------.
330| Prepare the muscles related to the states. |
331`--------------------------------------------*/
c3e23647 332
4a120d45 333static void
b0940840 334prepare_states (void)
c3e23647 335{
602bbf31 336 size_t i;
5fbb0954
AD
337 token_number_t *values =
338 (token_number_t *) alloca (sizeof (token_number_t) * nstates);
9703cc49 339 for (i = 0; i < nstates; ++i)
29e88316 340 values[i] = states[i]->accessing_symbol;
5372019f
AD
341 muscle_insert_token_number_table ("stos", values,
342 0, 1, nstates);
c3e23647
RS
343}
344
345
6c89f1c1
AD
346/*------------------------------------------------------------------.
347| Decide what to do for each type of token if seen as the lookahead |
348| token in specified state. The value returned is used as the |
349| default action (yydefact) for the state. In addition, actrow is |
350| filled with what to do for each kind of token, index by symbol |
351| number, with zero meaning do the default action. The value |
62a3e4f0 352| SHRT_MIN, a very negative number, means this situation is an |
6c89f1c1
AD
353| error. The parser recognizes this value specially. |
354| |
355| This is where conflicts are resolved. The loop over lookahead |
356| rules considered lower-numbered rules last, and the last rule |
357| considered that likes a token gets to handle it. |
358`------------------------------------------------------------------*/
c3e23647 359
4a120d45 360static int
f9507c28 361action_row (state_t *state)
c3e23647 362{
6c89f1c1 363 int i;
837491d8 364 int default_rule = 0;
f9507c28 365 reductions *redp = state->reductions;
f9507c28
AD
366 shifts *shiftp = state->shifts;
367 errs *errp = state->errs;
837491d8
AD
368 /* set nonzero to inhibit having any default reduction */
369 int nodefault = 0;
c3e23647
RS
370
371 for (i = 0; i < ntokens; i++)
372 actrow[i] = 0;
373
80dac38c 374 if (redp->nreds >= 1)
c3e23647 375 {
837491d8
AD
376 int j;
377 /* loop over all the rules available here which require
378 lookahead */
f9507c28 379 for (i = state->nlookaheads - 1; i >= 0; --i)
837491d8
AD
380 /* and find each token which the rule finds acceptable
381 to come next */
382 for (j = 0; j < ntokens; j++)
383 /* and record this rule as the rule to use if that
384 token follows. */
602bbf31 385 if (bitset_test (LA[state->lookaheadsp + i], j))
b0299a2e 386 actrow[j] = -LArule[state->lookaheadsp + i]->number;
c3e23647
RS
387 }
388
36281465
AD
389 /* Now see which tokens are allowed for shifts in this state. For
390 them, record the shift as the thing to do. So shift is preferred
391 to reduce. */
d954473d 392 for (i = 0; i < shiftp->nshifts; i++)
c3e23647 393 {
5fbb0954 394 token_number_t symbol;
837491d8 395 int shift_state = shiftp->shifts[i];
d954473d
AD
396 if (!shift_state)
397 continue;
c3e23647 398
29e88316 399 symbol = states[shift_state]->accessing_symbol;
c3e23647 400
d954473d
AD
401 if (ISVAR (symbol))
402 break;
c3e23647 403
d954473d 404 actrow[symbol] = shift_state;
c3e23647 405
d954473d
AD
406 /* Do not use any default reduction if there is a shift for
407 error */
007a50a4 408 if (symbol == errtoken->number)
d954473d 409 nodefault = 1;
c3e23647
RS
410 }
411
36281465 412 /* See which tokens are an explicit error in this state (due to
62a3e4f0 413 %nonassoc). For them, record SHRT_MIN as the action. */
2cec70b9
AD
414 for (i = 0; i < errp->nerrs; i++)
415 {
416 int symbol = errp->errs[i];
62a3e4f0 417 actrow[symbol] = SHRT_MIN;
2cec70b9 418 }
c3e23647 419
36281465
AD
420 /* Now find the most common reduction and make it the default action
421 for this state. */
c3e23647 422
80dac38c 423 if (redp->nreds >= 1 && !nodefault)
c3e23647 424 {
f9507c28 425 if (state->consistent)
c3e23647
RS
426 default_rule = redp->rules[0];
427 else
428 {
7a5350ba 429 int max = 0;
f9507c28 430 for (i = 0; i < state->nlookaheads; i++)
c3e23647 431 {
7a5350ba 432 int count = 0;
b0299a2e 433 int rule = -LArule[state->lookaheadsp + i]->number;
837491d8 434 int j;
9ee3c97b 435
c3e23647 436 for (j = 0; j < ntokens; j++)
837491d8
AD
437 if (actrow[j] == rule)
438 count++;
9ee3c97b 439
c3e23647
RS
440 if (count > max)
441 {
442 max = count;
443 default_rule = rule;
444 }
445 }
9ee3c97b 446
c3e23647
RS
447 /* actions which match the default are replaced with zero,
448 which means "use the default" */
9ee3c97b 449
c3e23647
RS
450 if (max > 0)
451 {
837491d8 452 int j;
c3e23647 453 for (j = 0; j < ntokens; j++)
837491d8
AD
454 if (actrow[j] == default_rule)
455 actrow[j] = 0;
9ee3c97b 456
ceed8467 457 default_rule = -default_rule;
c3e23647
RS
458 }
459 }
460 }
461
462 /* If have no default rule, the default is an error.
463 So replace any action which says "error" with "use default". */
464
465 if (default_rule == 0)
837491d8 466 for (i = 0; i < ntokens; i++)
62a3e4f0 467 if (actrow[i] == SHRT_MIN)
837491d8 468 actrow[i] = 0;
c3e23647 469
36281465 470 return default_rule;
c3e23647
RS
471}
472
473
4a120d45 474static void
d2729d44 475save_row (int state)
c3e23647 476{
6c89f1c1
AD
477 int i;
478 int count;
479 short *sp;
480 short *sp1;
481 short *sp2;
c3e23647
RS
482
483 count = 0;
484 for (i = 0; i < ntokens; i++)
796d61fb
AD
485 if (actrow[i] != 0)
486 count++;
c3e23647
RS
487
488 if (count == 0)
489 return;
490
d7913476
AD
491 froms[state] = sp1 = sp = XCALLOC (short, count);
492 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
493
494 for (i = 0; i < ntokens; i++)
796d61fb
AD
495 if (actrow[i] != 0)
496 {
497 *sp1++ = i;
498 *sp2++ = actrow[i];
499 }
c3e23647
RS
500
501 tally[state] = count;
502 width[state] = sp1[-1] - sp[0] + 1;
503}
504
505
6c89f1c1
AD
506/*------------------------------------------------------------------.
507| Figure out the actions for the specified state, indexed by |
508| lookahead token type. |
509| |
f2acea59
AD
510| The YYDEFACT table is output now. The detailed info is saved for |
511| putting into YYTABLE later. |
6c89f1c1 512`------------------------------------------------------------------*/
c3e23647 513
4a120d45 514static void
6c89f1c1 515token_actions (void)
c3e23647 516{
602bbf31 517 size_t i;
d7913476 518 short *yydefact = XCALLOC (short, nstates);
c3e23647 519
d7913476 520 actrow = XCALLOC (short, ntokens);
f2acea59 521 for (i = 0; i < nstates; ++i)
c3e23647 522 {
29e88316 523 yydefact[i] = action_row (states[i]);
6c89f1c1 524 save_row (i);
c3e23647 525 }
bbb5bcc6 526
5372019f
AD
527 muscle_insert_short_table ("defact", yydefact,
528 yydefact[0], 1, nstates);
26f609ff 529 XFREE (actrow);
d7913476 530 XFREE (yydefact);
c3e23647
RS
531}
532
533
3f96f4dc
AD
534/*-----------------------------.
535| Output the actions to OOUT. |
536`-----------------------------*/
537
9b3add5b 538void
be2a1a68 539actions_output (FILE *out)
3f96f4dc
AD
540{
541 int rule;
542 for (rule = 1; rule < nrules + 1; ++rule)
1a2b5d37 543 if (rules[rule].action)
3f96f4dc 544 {
ea52d706 545 fprintf (out, " case %d:\n", rule);
3f96f4dc
AD
546
547 if (!no_lines_flag)
ea52d706 548 fprintf (out, muscle_find ("linef"),
1a2b5d37 549 rules[rule].action_line,
ea52d706
AD
550 quotearg_style (c_quoting_style,
551 muscle_find ("filename")));
3f96f4dc
AD
552 /* As a Bison extension, add the ending semicolon. Since some
553 Yacc don't do that, help people using bison as a Yacc
554 finding their missing semicolons. */
ea52d706 555 fprintf (out, "{ %s%s }\n break;\n\n",
1a2b5d37 556 rules[rule].action,
ea52d706 557 yacc_flag ? ";" : "");
3f96f4dc
AD
558 }
559}
560
561
091e20bb
AD
562/*---------------------------------------.
563| Output the tokens definition to OOUT. |
564`---------------------------------------*/
565
9b3add5b 566void
be2a1a68 567token_definitions_output (FILE *out)
091e20bb
AD
568{
569 int i;
0d8bed56 570 int first = 1;
091e20bb
AD
571 for (i = 0; i < ntokens; ++i)
572 {
db8837cb 573 symbol_t *symbol = symbols[i];
091e20bb
AD
574 int number = symbol->user_token_number;
575
b87f8b21
AD
576 /* At this stage, if there are literal aliases, they are part of
577 SYMBOLS, so we should not find symbols which are the aliases
578 here. */
579 assert (number != USER_NUMBER_ALIAS);
580
091e20bb 581 /* Skip error token. */
007a50a4 582 if (symbol == errtoken)
091e20bb 583 continue;
b87f8b21
AD
584
585 /* If this string has an alias, then it is necessarily the alias
586 which is to be output. */
587 if (symbol->alias)
588 symbol = symbol->alias;
589
590 /* Don't output literal chars or strings (when defined only as a
591 string). Note that must be done after the alias resolution:
592 think about `%token 'f' "f"'. */
593 if (symbol->tag[0] == '\'' || symbol->tag[0] == '\"')
594 continue;
091e20bb
AD
595
596 /* Don't #define nonliteral tokens whose names contain periods
597 or '$' (as does the default value of the EOF token). */
598 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
599 continue;
600
83ccf991 601 fprintf (out, "%s[[[%s]], [%d]]",
0d8bed56 602 first ? "" : ",\n", symbol->tag, number);
b87f8b21 603
0d8bed56 604 first = 0;
091e20bb
AD
605 }
606}
607
608
4a120d45 609static void
d2729d44 610save_column (int symbol, int default_state)
c3e23647 611{
6c89f1c1 612 int i;
6c89f1c1
AD
613 short *sp;
614 short *sp1;
615 short *sp2;
616 int count;
837491d8 617 int symno = symbol - ntokens + nstates;
c3e23647 618
43591cec
AD
619 short begin = goto_map[symbol];
620 short end = goto_map[symbol + 1];
c3e23647
RS
621
622 count = 0;
43591cec 623 for (i = begin; i < end; i++)
796d61fb
AD
624 if (to_state[i] != default_state)
625 count++;
c3e23647
RS
626
627 if (count == 0)
628 return;
629
d7913476
AD
630 froms[symno] = sp1 = sp = XCALLOC (short, count);
631 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 632
43591cec 633 for (i = begin; i < end; i++)
796d61fb
AD
634 if (to_state[i] != default_state)
635 {
636 *sp1++ = from_state[i];
637 *sp2++ = to_state[i];
638 }
c3e23647
RS
639
640 tally[symno] = count;
641 width[symno] = sp1[-1] - sp[0] + 1;
642}
643
6c89f1c1
AD
644static int
645default_goto (int symbol)
646{
602bbf31
AD
647 size_t i;
648 size_t m = goto_map[symbol];
649 size_t n = goto_map[symbol + 1];
837491d8
AD
650 int default_state = -1;
651 int max = 0;
6c89f1c1
AD
652
653 if (m == n)
654 return -1;
655
656 for (i = 0; i < nstates; i++)
657 state_count[i] = 0;
658
659 for (i = m; i < n; i++)
660 state_count[to_state[i]]++;
661
6c89f1c1 662 for (i = 0; i < nstates; i++)
796d61fb
AD
663 if (state_count[i] > max)
664 {
665 max = state_count[i];
666 default_state = i;
667 }
6c89f1c1
AD
668
669 return default_state;
670}
671
672
673/*-------------------------------------------------------------------.
674| Figure out what to do after reducing with each rule, depending on |
675| the saved state from before the beginning of parsing the data that |
676| matched this rule. |
677| |
678| The YYDEFGOTO table is output now. The detailed info is saved for |
679| putting into YYTABLE later. |
680`-------------------------------------------------------------------*/
681
682static void
683goto_actions (void)
684{
43591cec 685 int i;
bbb5bcc6 686 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 687
26f609ff 688 state_count = XCALLOC (short, nstates);
43591cec 689 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 690 {
43591cec
AD
691 int default_state = default_goto (i);
692 save_column (i, default_state);
693 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
694 }
695
5372019f
AD
696 muscle_insert_short_table ("defgoto", yydefgoto,
697 yydefgoto[0], 1, nsyms - ntokens);
d7913476 698 XFREE (state_count);
43591cec 699 XFREE (yydefgoto);
6c89f1c1 700}
c3e23647
RS
701
702
9ee3c97b
AD
703/* The next few functions decide how to pack the actions and gotos
704 information into yytable. */
c3e23647 705
4a120d45 706static void
d2729d44 707sort_actions (void)
c3e23647 708{
6c89f1c1 709 int i;
c3e23647 710
d7913476 711 order = XCALLOC (short, nvectors);
c3e23647
RS
712 nentries = 0;
713
714 for (i = 0; i < nvectors; i++)
796d61fb
AD
715 if (tally[i] > 0)
716 {
837491d8
AD
717 int k;
718 int t = tally[i];
719 int w = width[i];
720 int j = nentries - 1;
c3e23647 721
796d61fb
AD
722 while (j >= 0 && (width[order[j]] < w))
723 j--;
c3e23647 724
796d61fb
AD
725 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
726 j--;
c3e23647 727
796d61fb
AD
728 for (k = nentries - 1; k > j; k--)
729 order[k + 1] = order[k];
c3e23647 730
796d61fb
AD
731 order[j + 1] = i;
732 nentries++;
733 }
c3e23647
RS
734}
735
736
4a120d45 737static int
d2729d44 738matching_state (int vector)
c3e23647 739{
837491d8 740 int i = order[vector];
6c89f1c1
AD
741 int t;
742 int w;
6c89f1c1 743 int prev;
c3e23647 744
602bbf31 745 if (i >= (int) nstates)
36281465 746 return -1;
c3e23647
RS
747
748 t = tally[i];
749 w = width[i];
750
751 for (prev = vector - 1; prev >= 0; prev--)
752 {
837491d8
AD
753 int j = order[prev];
754 int k;
755 int match = 1;
756
c3e23647 757 if (width[j] != w || tally[j] != t)
36281465 758 return -1;
c3e23647 759
c3e23647 760 for (k = 0; match && k < t; k++)
796d61fb
AD
761 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
762 match = 0;
c3e23647
RS
763
764 if (match)
36281465 765 return j;
c3e23647
RS
766 }
767
36281465 768 return -1;
c3e23647
RS
769}
770
771
4a120d45 772static int
d2729d44 773pack_vector (int vector)
c3e23647 774{
837491d8 775 int i = order[vector];
6c89f1c1 776 int j;
837491d8 777 int t = tally[i];
6c89f1c1 778 int loc = 0;
837491d8
AD
779 short *from = froms[i];
780 short *to = tos[i];
c3e23647 781
340ef489 782 assert (t);
c3e23647 783
133c20e2 784 for (j = lowzero - from[0]; j < (int) table_size; j++)
c3e23647 785 {
837491d8
AD
786 int k;
787 int ok = 1;
c3e23647
RS
788
789 for (k = 0; ok && k < t; k++)
790 {
791 loc = j + from[k];
133c20e2
AD
792 if (loc > (int) table_size)
793 table_grow (loc);
c3e23647
RS
794
795 if (table[loc] != 0)
796 ok = 0;
797 }
798
799 for (k = 0; ok && k < vector; k++)
796d61fb
AD
800 if (pos[k] == j)
801 ok = 0;
c3e23647
RS
802
803 if (ok)
804 {
805 for (k = 0; k < t; k++)
806 {
807 loc = j + from[k];
808 table[loc] = to[k];
809 check[loc] = from[k];
810 }
811
812 while (table[lowzero] != 0)
813 lowzero++;
814
815 if (loc > high)
816 high = loc;
817
36281465 818 return j;
c3e23647
RS
819 }
820 }
275fc3ad
AD
821#define pack_vector_succeeded 0
822 assert (pack_vector_succeeded);
3843c413 823 return 0;
c3e23647
RS
824}
825
826
6c89f1c1
AD
827static void
828pack_table (void)
829{
830 int i;
831 int place;
832 int state;
833
d7913476
AD
834 base = XCALLOC (short, nvectors);
835 pos = XCALLOC (short, nentries);
133c20e2
AD
836 table = XCALLOC (short, table_size);
837 check = XCALLOC (short, table_size);
6c89f1c1
AD
838
839 lowzero = 0;
840 high = 0;
841
842 for (i = 0; i < nvectors; i++)
62a3e4f0 843 base[i] = SHRT_MIN;
6c89f1c1 844
133c20e2 845 for (i = 0; i < (int) table_size; i++)
6c89f1c1
AD
846 check[i] = -1;
847
848 for (i = 0; i < nentries; i++)
849 {
850 state = matching_state (i);
851
852 if (state < 0)
853 place = pack_vector (i);
854 else
855 place = base[state];
856
857 pos[i] = place;
858 base[order[i]] = place;
859 }
860
861 for (i = 0; i < nvectors; i++)
862 {
796d61fb
AD
863 XFREE (froms[i]);
864 XFREE (tos[i]);
6c89f1c1
AD
865 }
866
d7913476
AD
867 XFREE (froms);
868 XFREE (tos);
869 XFREE (pos);
6c89f1c1 870}
c3e23647
RS
871
872/* the following functions output yytable, yycheck
873 and the vectors whose elements index the portion starts */
874
4a120d45 875static void
d2729d44 876output_base (void)
c3e23647 877{
26f609ff 878 /* Output pact. */
5372019f
AD
879 muscle_insert_short_table ("pact", base,
880 base[0], 1, nstates);
c3e23647 881
26f609ff 882 /* Output pgoto. */
5372019f
AD
883 muscle_insert_short_table ("pgoto", base,
884 base[nstates], nstates + 1, nvectors);
d7913476 885 XFREE (base);
c3e23647
RS
886}
887
888
4a120d45 889static void
d2729d44 890output_table (void)
c3e23647 891{
5372019f
AD
892 muscle_insert_short_table ("table", table,
893 table[0], 1, high + 1);
d7913476 894 XFREE (table);
c3e23647
RS
895}
896
897
4a120d45 898static void
d2729d44 899output_check (void)
c3e23647 900{
5372019f
AD
901 muscle_insert_short_table ("check", check,
902 check[0], 1, high + 1);
d7913476 903 XFREE (check);
c3e23647
RS
904}
905
b0940840
AD
906/*-----------------------------------------------------------------.
907| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
908| and yycheck. |
909`-----------------------------------------------------------------*/
6c89f1c1
AD
910
911static void
912output_actions (void)
913{
602bbf31 914 size_t i;
6c89f1c1 915 nvectors = nstates + nvars;
c3e23647 916
d7913476
AD
917 froms = XCALLOC (short *, nvectors);
918 tos = XCALLOC (short *, nvectors);
919 tally = XCALLOC (short, nvectors);
920 width = XCALLOC (short, nvectors);
6c89f1c1
AD
921
922 token_actions ();
914feea9 923 bitsetv_free (LA);
b0299a2e 924 free (LArule);
6c89f1c1
AD
925
926 goto_actions ();
d7913476
AD
927 XFREE (goto_map + ntokens);
928 XFREE (from_state);
929 XFREE (to_state);
6c89f1c1
AD
930
931 sort_actions ();
932 pack_table ();
4e5caae2 933
6c89f1c1
AD
934 output_base ();
935 output_table ();
4e5caae2 936
6c89f1c1 937 output_check ();
49701457
AD
938
939 for (i = 0; i < nstates; ++i)
940 {
29e88316
AD
941 free (states[i]->shifts);
942 XFREE (states[i]->reductions);
943 free (states[i]->errs);
944 free (states[i]);
49701457 945 }
29e88316 946 XFREE (states);
6c89f1c1 947}
c3e23647 948
652def80 949\f
1239777d
AD
950/*---------------------------.
951| Call the skeleton parser. |
952`---------------------------*/
c3e23647 953
4a120d45 954static void
1239777d 955output_skeleton (void)
9b3add5b 956{
be2a1a68 957 /* Store the definition of all the muscles. */
d0039cbc 958 const char *tempdir = getenv ("TMPDIR");
381fb12e
AD
959 char *tempfile = NULL;
960 FILE *out = NULL;
381fb12e
AD
961 int fd;
962
963 if (tempdir == NULL)
964 tempdir = DEFAULT_TMPDIR;
965 tempfile = xmalloc (strlen (tempdir) + 11);
966 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
967 fd = mkstemp (tempfile);
968 if (fd == -1)
969 error (EXIT_FAILURE, errno, "%s", tempfile);
970
971 out = fdopen (fd, "w");
972 if (out == NULL)
973 error (EXIT_FAILURE, errno, "%s", tempfile);
974
975 /* There are no comments, especially not `#': we do want M4 expansion
976 after `#': think of CPP macros! */
977 fputs ("m4_changecom()\n", out);
978 fputs ("m4_init()\n", out);
979
980 fputs ("m4_define([b4_actions], \n[[", out);
981 actions_output (out);
982 fputs ("]])\n\n", out);
983
0d8bed56 984 fputs ("m4_define([b4_tokens], \n[", out);
381fb12e 985 token_definitions_output (out);
0d8bed56 986 fputs ("])\n\n", out);
be2a1a68 987
381fb12e 988 muscles_m4_output (out);
be2a1a68 989
381fb12e
AD
990 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
991 fputs ("m4_divert_push(0)dnl\n", out);
992 xfclose (out);
be2a1a68
AD
993
994 /* Invoke m4 on the definition of the muscles, and the skeleton. */
995 {
996 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
abe017f6
AD
997 const char *m4 = getenv ("M4");
998 if (!m4)
999 m4 = M4;
be2a1a68
AD
1000 if (!bison_pkgdatadir)
1001 bison_pkgdatadir = PKGDATADIR;
381fb12e
AD
1002 if (trace_flag)
1003 fprintf (stderr,
abe017f6
AD
1004 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1005 m4, bison_pkgdatadir, tempfile, skeleton);
1006 skel_in = readpipe (m4,
1007 "-I", bison_pkgdatadir,
be2a1a68 1008 "m4sugar/m4sugar.m4",
381fb12e 1009 tempfile,
be2a1a68
AD
1010 skeleton,
1011 NULL);
1012 if (!skel_in)
1013 error (EXIT_FAILURE, errno, "cannot run m4");
1014 skel_lex ();
381fb12e
AD
1015
1016 /* If `debugging', keep this file alive. */
1017 if (!trace_flag)
1018 unlink (tempfile);
be2a1a68 1019 }
26f609ff
RA
1020}
1021
1022static void
1023prepare (void)
1024{
11d82f03 1025 MUSCLE_INSERT_INT ("last", high);
62a3e4f0 1026 MUSCLE_INSERT_INT ("flag", SHRT_MIN);
11d82f03
MA
1027 MUSCLE_INSERT_INT ("pure", pure_parser);
1028 MUSCLE_INSERT_INT ("nsym", nsyms);
1029 MUSCLE_INSERT_INT ("debug", debug_flag);
1030 MUSCLE_INSERT_INT ("final", final_state);
007a50a4
AD
1031 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
1032 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
be2a1a68 1033 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
b5b61c61 1034 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
11d82f03 1035
b85810ae
AD
1036 /* FIXME: This is wrong: the muscles should decide whether they hold
1037 a copy or not, but the situation is too obscure currently. */
be2a1a68
AD
1038 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1039 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1040 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1041 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
b85810ae 1042
11d82f03
MA
1043 MUSCLE_INSERT_INT ("nnts", nvars);
1044 MUSCLE_INSERT_INT ("nrules", nrules);
1045 MUSCLE_INSERT_INT ("nstates", nstates);
1046 MUSCLE_INSERT_INT ("ntokens", ntokens);
1047
be2a1a68
AD
1048 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1049 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
381fb12e
AD
1050
1051 /* Copy definitions in directive. */
0dd1580a
RA
1052 obstack_1grow (&pre_prologue_obstack, 0);
1053 obstack_1grow (&post_prologue_obstack, 0);
1054 muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack));
1055 muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack));
381fb12e
AD
1056
1057 /* Find the right skeleton file. */
1058 if (!skeleton)
fdbcd8e2 1059 skeleton = "bison.simple";
381fb12e
AD
1060
1061 /* Parse the skeleton file and output the needed parsers. */
1062 muscle_insert ("skeleton", skeleton);
26f609ff 1063}
c3e23647 1064
93ede233 1065
6c89f1c1
AD
1066/*----------------------------------------------------------.
1067| Output the parsing tables and the parser code to ftable. |
1068`----------------------------------------------------------*/
c3e23647 1069
6c89f1c1
AD
1070void
1071output (void)
1072{
f87685c3 1073 obstack_init (&format_obstack);
dd60faec 1074
b0940840
AD
1075 prepare_tokens ();
1076 prepare_rules ();
1077 prepare_states ();
6c89f1c1 1078 output_actions ();
342b8b6e 1079
26f609ff 1080 prepare ();
652def80 1081
9b3add5b
RA
1082 /* Process the selected skeleton file. */
1083 output_skeleton ();
1084
f499b062
AD
1085 obstack_free (&muscle_obstack, NULL);
1086 obstack_free (&format_obstack, NULL);
1087 obstack_free (&action_obstack, NULL);
0dd1580a
RA
1088 obstack_free (&pre_prologue_obstack, NULL);
1089 obstack_free (&post_prologue_obstack, NULL);
c3e23647 1090}