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