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