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