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