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