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