]> git.saurik.com Git - bison.git/blame - src/output.c
* src/conflicts.c (set_conflicts): Use bitset_disjoint_p.
[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;
571 for (i = 0; i < ntokens; ++i)
572 {
573 bucket *symbol = symbols[i];
574 int number = symbol->user_token_number;
575
576 if (number == SALIAS)
577 continue;
578 /* Skip error token. */
579 if (symbol->value == error_token_number)
580 continue;
581 if (symbol->tag[0] == '\'')
582 continue; /* skip literal character */
583 if (symbol->tag[0] == '\"')
584 {
585 /* use literal string only if given a symbol with an alias */
586 if (symbol->alias)
587 symbol = symbol->alias;
588 else
589 continue;
590 }
591
592 /* Don't #define nonliteral tokens whose names contain periods
593 or '$' (as does the default value of the EOF token). */
594 if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$'))
595 continue;
596
597 fprintf (out, "# define %s\t%d\n",
598 symbol->tag, number);
091e20bb 599 if (semantic_parser)
be2a1a68
AD
600 /* FIXME: This is probably wrong, and should be just as
601 above. --akim. */
602 fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value);
091e20bb
AD
603 }
604}
605
606
4a120d45 607static void
d2729d44 608save_column (int symbol, int default_state)
c3e23647 609{
6c89f1c1 610 int i;
6c89f1c1
AD
611 short *sp;
612 short *sp1;
613 short *sp2;
614 int count;
837491d8 615 int symno = symbol - ntokens + nstates;
c3e23647 616
43591cec
AD
617 short begin = goto_map[symbol];
618 short end = goto_map[symbol + 1];
c3e23647
RS
619
620 count = 0;
43591cec 621 for (i = begin; i < end; i++)
796d61fb
AD
622 if (to_state[i] != default_state)
623 count++;
c3e23647
RS
624
625 if (count == 0)
626 return;
627
d7913476
AD
628 froms[symno] = sp1 = sp = XCALLOC (short, count);
629 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 630
43591cec 631 for (i = begin; i < end; i++)
796d61fb
AD
632 if (to_state[i] != default_state)
633 {
634 *sp1++ = from_state[i];
635 *sp2++ = to_state[i];
636 }
c3e23647
RS
637
638 tally[symno] = count;
639 width[symno] = sp1[-1] - sp[0] + 1;
640}
641
6c89f1c1
AD
642static int
643default_goto (int symbol)
644{
602bbf31
AD
645 size_t i;
646 size_t m = goto_map[symbol];
647 size_t n = goto_map[symbol + 1];
837491d8
AD
648 int default_state = -1;
649 int max = 0;
6c89f1c1
AD
650
651 if (m == n)
652 return -1;
653
654 for (i = 0; i < nstates; i++)
655 state_count[i] = 0;
656
657 for (i = m; i < n; i++)
658 state_count[to_state[i]]++;
659
6c89f1c1 660 for (i = 0; i < nstates; i++)
796d61fb
AD
661 if (state_count[i] > max)
662 {
663 max = state_count[i];
664 default_state = i;
665 }
6c89f1c1
AD
666
667 return default_state;
668}
669
670
671/*-------------------------------------------------------------------.
672| Figure out what to do after reducing with each rule, depending on |
673| the saved state from before the beginning of parsing the data that |
674| matched this rule. |
675| |
676| The YYDEFGOTO table is output now. The detailed info is saved for |
677| putting into YYTABLE later. |
678`-------------------------------------------------------------------*/
679
680static void
681goto_actions (void)
682{
43591cec 683 int i;
bbb5bcc6 684 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 685
26f609ff 686 state_count = XCALLOC (short, nstates);
43591cec 687 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 688 {
43591cec
AD
689 int default_state = default_goto (i);
690 save_column (i, default_state);
691 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
692 }
693
f87685c3 694 output_table_data (&format_obstack, yydefgoto,
26f609ff 695 yydefgoto[0], 1, nsyms - ntokens);
f87685c3 696 muscle_insert ("defgoto", obstack_finish (&format_obstack));
43591cec 697
d7913476 698 XFREE (state_count);
43591cec 699 XFREE (yydefgoto);
6c89f1c1 700}
c3e23647
RS
701
702
9ee3c97b
AD
703/* The next few functions decide how to pack the actions and gotos
704 information into yytable. */
c3e23647 705
4a120d45 706static void
d2729d44 707sort_actions (void)
c3e23647 708{
6c89f1c1 709 int i;
c3e23647 710
d7913476 711 order = XCALLOC (short, nvectors);
c3e23647
RS
712 nentries = 0;
713
714 for (i = 0; i < nvectors; i++)
796d61fb
AD
715 if (tally[i] > 0)
716 {
837491d8
AD
717 int k;
718 int t = tally[i];
719 int w = width[i];
720 int j = nentries - 1;
c3e23647 721
796d61fb
AD
722 while (j >= 0 && (width[order[j]] < w))
723 j--;
c3e23647 724
796d61fb
AD
725 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
726 j--;
c3e23647 727
796d61fb
AD
728 for (k = nentries - 1; k > j; k--)
729 order[k + 1] = order[k];
c3e23647 730
796d61fb
AD
731 order[j + 1] = i;
732 nentries++;
733 }
c3e23647
RS
734}
735
736
4a120d45 737static int
d2729d44 738matching_state (int vector)
c3e23647 739{
837491d8 740 int i = order[vector];
6c89f1c1
AD
741 int t;
742 int w;
6c89f1c1 743 int prev;
c3e23647 744
602bbf31 745 if (i >= (int) nstates)
36281465 746 return -1;
c3e23647
RS
747
748 t = tally[i];
749 w = width[i];
750
751 for (prev = vector - 1; prev >= 0; prev--)
752 {
837491d8
AD
753 int j = order[prev];
754 int k;
755 int match = 1;
756
c3e23647 757 if (width[j] != w || tally[j] != t)
36281465 758 return -1;
c3e23647 759
c3e23647 760 for (k = 0; match && k < t; k++)
796d61fb
AD
761 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
762 match = 0;
c3e23647
RS
763
764 if (match)
36281465 765 return j;
c3e23647
RS
766 }
767
36281465 768 return -1;
c3e23647
RS
769}
770
771
4a120d45 772static int
d2729d44 773pack_vector (int vector)
c3e23647 774{
837491d8 775 int i = order[vector];
6c89f1c1 776 int j;
837491d8 777 int t = tally[i];
6c89f1c1 778 int loc = 0;
837491d8
AD
779 short *from = froms[i];
780 short *to = tos[i];
c3e23647 781
340ef489 782 assert (t);
c3e23647 783
c3e23647
RS
784 for (j = lowzero - from[0]; j < MAXTABLE; j++)
785 {
837491d8
AD
786 int k;
787 int ok = 1;
c3e23647
RS
788
789 for (k = 0; ok && k < t; k++)
790 {
791 loc = j + from[k];
792 if (loc > MAXTABLE)
a0f6b076 793 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
c3e23647
RS
794
795 if (table[loc] != 0)
796 ok = 0;
797 }
798
799 for (k = 0; ok && k < vector; k++)
796d61fb
AD
800 if (pos[k] == j)
801 ok = 0;
c3e23647
RS
802
803 if (ok)
804 {
805 for (k = 0; k < t; k++)
806 {
807 loc = j + from[k];
808 table[loc] = to[k];
809 check[loc] = from[k];
810 }
811
812 while (table[lowzero] != 0)
813 lowzero++;
814
815 if (loc > high)
816 high = loc;
817
36281465 818 return j;
c3e23647
RS
819 }
820 }
275fc3ad
AD
821#define pack_vector_succeeded 0
822 assert (pack_vector_succeeded);
3843c413 823 return 0;
c3e23647
RS
824}
825
826
6c89f1c1
AD
827static void
828pack_table (void)
829{
830 int i;
831 int place;
832 int state;
833
d7913476
AD
834 base = XCALLOC (short, nvectors);
835 pos = XCALLOC (short, nentries);
836 table = XCALLOC (short, MAXTABLE);
837 check = XCALLOC (short, MAXTABLE);
6c89f1c1
AD
838
839 lowzero = 0;
840 high = 0;
841
842 for (i = 0; i < nvectors; i++)
843 base[i] = MINSHORT;
844
845 for (i = 0; i < MAXTABLE; i++)
846 check[i] = -1;
847
848 for (i = 0; i < nentries; i++)
849 {
850 state = matching_state (i);
851
852 if (state < 0)
853 place = pack_vector (i);
854 else
855 place = base[state];
856
857 pos[i] = place;
858 base[order[i]] = place;
859 }
860
861 for (i = 0; i < nvectors; i++)
862 {
796d61fb
AD
863 XFREE (froms[i]);
864 XFREE (tos[i]);
6c89f1c1
AD
865 }
866
d7913476
AD
867 XFREE (froms);
868 XFREE (tos);
869 XFREE (pos);
6c89f1c1 870}
c3e23647
RS
871
872/* the following functions output yytable, yycheck
873 and the vectors whose elements index the portion starts */
874
4a120d45 875static void
d2729d44 876output_base (void)
c3e23647 877{
26f609ff 878 /* Output pact. */
f87685c3 879 output_table_data (&format_obstack, base,
26f609ff 880 base[0], 1, nstates);
f87685c3 881 muscle_insert ("pact", obstack_finish (&format_obstack));
c3e23647 882
26f609ff 883 /* Output pgoto. */
f87685c3 884 output_table_data (&format_obstack, base,
26f609ff 885 base[nstates], nstates + 1, nvectors);
f87685c3 886 muscle_insert ("pgoto", obstack_finish (&format_obstack));
c3e23647 887
d7913476 888 XFREE (base);
c3e23647
RS
889}
890
891
4a120d45 892static void
d2729d44 893output_table (void)
c3e23647 894{
f87685c3 895 output_table_data (&format_obstack, table,
26f609ff 896 table[0], 1, high + 1);
f87685c3 897 muscle_insert ("table", obstack_finish (&format_obstack));
d7913476 898 XFREE (table);
c3e23647
RS
899}
900
901
4a120d45 902static void
d2729d44 903output_check (void)
c3e23647 904{
f87685c3 905 output_table_data (&format_obstack, check,
26f609ff 906 check[0], 1, high + 1);
f87685c3 907 muscle_insert ("check", obstack_finish (&format_obstack));
d7913476 908 XFREE (check);
c3e23647
RS
909}
910
6c89f1c1
AD
911/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
912 and yycheck. */
913
914static void
915output_actions (void)
916{
602bbf31 917 size_t i;
6c89f1c1 918 nvectors = nstates + nvars;
c3e23647 919
d7913476
AD
920 froms = XCALLOC (short *, nvectors);
921 tos = XCALLOC (short *, nvectors);
922 tally = XCALLOC (short, nvectors);
923 width = XCALLOC (short, nvectors);
6c89f1c1
AD
924
925 token_actions ();
914feea9 926 bitsetv_free (LA);
d7913476 927 XFREE (LAruleno);
6c89f1c1
AD
928
929 goto_actions ();
d7913476
AD
930 XFREE (goto_map + ntokens);
931 XFREE (from_state);
932 XFREE (to_state);
6c89f1c1
AD
933
934 sort_actions ();
935 pack_table ();
4e5caae2 936
6c89f1c1
AD
937 output_base ();
938 output_table ();
4e5caae2 939
6c89f1c1 940 output_check ();
49701457
AD
941
942 for (i = 0; i < nstates; ++i)
943 {
29e88316
AD
944 free (states[i]->shifts);
945 XFREE (states[i]->reductions);
946 free (states[i]->errs);
947 free (states[i]);
49701457 948 }
29e88316 949 XFREE (states);
6c89f1c1 950}
c3e23647 951
652def80 952\f
1239777d
AD
953/*---------------------------.
954| Call the skeleton parser. |
955`---------------------------*/
c3e23647 956
4a120d45 957static void
1239777d 958output_skeleton (void)
9b3add5b 959{
be2a1a68 960 /* Store the definition of all the muscles. */
381fb12e
AD
961 char *tempdir = getenv ("TMPDIR");
962 char *tempfile = NULL;
963 FILE *out = NULL;
964 ssize_t bytes_read;
965 int fd;
966
967 if (tempdir == NULL)
968 tempdir = DEFAULT_TMPDIR;
969 tempfile = xmalloc (strlen (tempdir) + 11);
970 sprintf (tempfile, "%s/bsnXXXXXX", tempdir);
971 fd = mkstemp (tempfile);
972 if (fd == -1)
973 error (EXIT_FAILURE, errno, "%s", tempfile);
974
975 out = fdopen (fd, "w");
976 if (out == NULL)
977 error (EXIT_FAILURE, errno, "%s", tempfile);
978
979 /* There are no comments, especially not `#': we do want M4 expansion
980 after `#': think of CPP macros! */
981 fputs ("m4_changecom()\n", out);
982 fputs ("m4_init()\n", out);
983
984 fputs ("m4_define([b4_actions], \n[[", out);
985 actions_output (out);
986 fputs ("]])\n\n", out);
987
988 fputs ("m4_define([b4_guards], \n[[", out);
989 guards_output (out);
990 fputs ("]])\n\n", out);
991
992 fputs ("m4_define([b4_tokendef], \n[[", out);
993 token_definitions_output (out);
994 fputs ("]])\n\n", out);
be2a1a68 995
381fb12e 996 muscles_m4_output (out);
be2a1a68 997
381fb12e
AD
998 fputs ("m4_wrap([m4_divert_pop(0)])\n", out);
999 fputs ("m4_divert_push(0)dnl\n", out);
1000 xfclose (out);
be2a1a68
AD
1001
1002 /* Invoke m4 on the definition of the muscles, and the skeleton. */
1003 {
1004 const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
abe017f6
AD
1005 const char *m4 = getenv ("M4");
1006 if (!m4)
1007 m4 = M4;
be2a1a68
AD
1008 if (!bison_pkgdatadir)
1009 bison_pkgdatadir = PKGDATADIR;
381fb12e
AD
1010 if (trace_flag)
1011 fprintf (stderr,
abe017f6
AD
1012 "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
1013 m4, bison_pkgdatadir, tempfile, skeleton);
1014 skel_in = readpipe (m4,
1015 "-I", bison_pkgdatadir,
be2a1a68 1016 "m4sugar/m4sugar.m4",
381fb12e 1017 tempfile,
be2a1a68
AD
1018 skeleton,
1019 NULL);
1020 if (!skel_in)
1021 error (EXIT_FAILURE, errno, "cannot run m4");
1022 skel_lex ();
381fb12e
AD
1023
1024 /* If `debugging', keep this file alive. */
1025 if (!trace_flag)
1026 unlink (tempfile);
be2a1a68 1027 }
26f609ff
RA
1028}
1029
1030static void
1031prepare (void)
1032{
11d82f03
MA
1033 MUSCLE_INSERT_INT ("last", high);
1034 MUSCLE_INSERT_INT ("flag", MINSHORT);
1035 MUSCLE_INSERT_INT ("pure", pure_parser);
1036 MUSCLE_INSERT_INT ("nsym", nsyms);
1037 MUSCLE_INSERT_INT ("debug", debug_flag);
1038 MUSCLE_INSERT_INT ("final", final_state);
1039 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
be2a1a68 1040 MUSCLE_INSERT_INT ("error_verbose", error_verbose);
b5b61c61 1041 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
11d82f03 1042
b85810ae
AD
1043 /* FIXME: This is wrong: the muscles should decide whether they hold
1044 a copy or not, but the situation is too obscure currently. */
be2a1a68
AD
1045 MUSCLE_INSERT_STRING ("output_infix", output_infix ? output_infix : "");
1046 MUSCLE_INSERT_STRING ("output_prefix", short_base_name);
1047 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name);
1048 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file);
b85810ae 1049
11d82f03
MA
1050 MUSCLE_INSERT_INT ("nnts", nvars);
1051 MUSCLE_INSERT_INT ("nrules", nrules);
1052 MUSCLE_INSERT_INT ("nstates", nstates);
1053 MUSCLE_INSERT_INT ("ntokens", ntokens);
1054
be2a1a68
AD
1055 MUSCLE_INSERT_INT ("locations_flag", locations_flag);
1056 MUSCLE_INSERT_INT ("defines_flag", defines_flag);
381fb12e
AD
1057
1058 /* Copy definitions in directive. */
1059 obstack_1grow (&attrs_obstack, 0);
1060 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
1061
1062 /* Find the right skeleton file. */
1063 if (!skeleton)
1064 {
1065 if (semantic_parser)
1066 skeleton = "bison.hairy";
1067 else
1068 skeleton = "bison.simple";
1069 }
1070
1071 /* Parse the skeleton file and output the needed parsers. */
1072 muscle_insert ("skeleton", skeleton);
26f609ff 1073}
c3e23647 1074
93ede233 1075
6c89f1c1
AD
1076/*----------------------------------------------------------.
1077| Output the parsing tables and the parser code to ftable. |
1078`----------------------------------------------------------*/
c3e23647 1079
6c89f1c1
AD
1080void
1081output (void)
1082{
f87685c3 1083 obstack_init (&format_obstack);
dd60faec 1084
6c89f1c1 1085 output_token_translations ();
6c89f1c1 1086 output_gram ();
26f609ff 1087
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
f499b062
AD
1098 obstack_free (&muscle_obstack, NULL);
1099 obstack_free (&format_obstack, NULL);
1100 obstack_free (&action_obstack, NULL);
f499b062 1101 obstack_free (&attrs_obstack, NULL);
c3e23647 1102}