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