]> git.saurik.com Git - bison.git/blame - src/output.c
* src/lalr.c (build_relations): Rename `states' as `states1'.
[bison.git] / src / output.c
CommitLineData
c3e23647 1/* Output the generated parsing program for bison,
255ef638
AD
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001
3 Free Software Foundation, Inc.
c3e23647 4
9ee3c97b 5 This file is part of Bison, the GNU Compiler Compiler.
c3e23647 6
9ee3c97b
AD
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
c3e23647 11
9ee3c97b
AD
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
c3e23647 16
9ee3c97b
AD
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
c3e23647
RS
21
22
255ef638
AD
23/* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
25 are set.
c3e23647 26
255ef638
AD
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
28 token numbers.
c3e23647 29
255ef638 30 ++ YYTNAME = vector of string-names indexed by bison token number.
c3e23647 31
255ef638
AD
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
33 entries in YYTNAME.
c3e23647 34
255ef638
AD
35 YYRLINE = vector of line-numbers of all rules. For yydebug
36 printouts.
c3e23647 37
255ef638
AD
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
c3e23647 40
255ef638 41 YYPRHS[R] = index in YYRHS of first item for rule R.
c3e23647 42
255ef638 43 YYR1[R] = symbol number of symbol that rule R derives.
c3e23647 44
255ef638 45 YYR2[R] = number of symbols composing right hand side of rule R.
c3e23647 46
255ef638
AD
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
48 S.
e372befa 49
255ef638
AD
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
52 error.
c3e23647 53
255ef638
AD
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
56 something else to do.
c3e23647 57
255ef638
AD
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
60 out what to do.
c3e23647 61
255ef638
AD
62 If the value in YYTABLE is positive, we shift the token and go to
63 that state.
c3e23647 64
6c89f1c1 65 If the value is negative, it is minus a rule number to reduce by.
c3e23647 66
255ef638
AD
67 If the value is zero, the default action from YYDEFACT[S] is used.
68
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
74
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
77
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
80 examine.
81
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
87
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
c3e23647 90
c3e23647 91#include "system.h"
14d3eb9b 92#include "quotearg.h"
ceed8467 93#include "getargs.h"
c3e23647
RS
94#include "files.h"
95#include "gram.h"
b2ca4022 96#include "LR0.h"
a0f6b076 97#include "complain.h"
6c89f1c1 98#include "output.h"
720d742f 99#include "lalr.h"
a70083a3 100#include "reader.h"
ad949da9 101#include "symtab.h"
0619caf0 102#include "conflicts.h"
11d82f03 103#include "muscle_tab.h"
c3e23647 104
d019d655 105
c3e23647
RS
106static int nvectors;
107static int nentries;
342b8b6e
AD
108static short **froms = NULL;
109static short **tos = NULL;
110static short *tally = NULL;
111static short *width = NULL;
112static short *actrow = NULL;
113static short *state_count = NULL;
114static short *order = NULL;
115static short *base = NULL;
116static short *pos = NULL;
117static short *table = NULL;
118static short *check = NULL;
c3e23647
RS
119static int lowzero;
120static int high;
121
11d82f03 122struct obstack muscle_obstack;
f87685c3 123static struct obstack format_obstack;
c3e23647 124
c7925b99
MA
125int error_verbose = 0;
126
f0440388
MA
127/* Returns the number of lines of S. */
128static size_t
129get_lines_number (const char *s)
130{
131 size_t lines = 0;
1fa14068 132
f0440388
MA
133 size_t i;
134 for (i = 0; s[i]; ++i)
d0b0fefa
AD
135 if (s[i] == '\n')
136 ++lines;
1fa14068 137
f0440388
MA
138 return lines;
139}
140
141
26f609ff 142/* FIXME. */
c3e23647 143
d019d655 144static inline void
342b8b6e
AD
145output_table_data (struct obstack *oout,
146 short *table_data,
147 short first,
1fa14068
AD
148 int begin,
149 int end)
d019d655 150{
26f609ff
RA
151 int i;
152 int j = 1;
342b8b6e 153
26f609ff
RA
154 obstack_fgrow1 (oout, "%6d", first);
155 for (i = begin; i < end; ++i)
d019d655 156 {
896fe5c1 157 obstack_1grow (oout, ',');
d019d655
AD
158 if (j >= 10)
159 {
ff4423cc 160 obstack_sgrow (oout, "\n ");
d019d655
AD
161 j = 1;
162 }
163 else
26f609ff 164 ++j;
8f451ef7 165 obstack_fgrow1 (oout, "%6d", table_data[i]);
c3e23647 166 }
26f609ff 167 obstack_1grow (oout, 0);
c3e23647
RS
168}
169
170
4a120d45 171static void
d2729d44 172output_token_translations (void)
c3e23647 173{
f87685c3 174 output_table_data (&format_obstack, token_translations,
26f609ff 175 0, 1, max_user_token_number + 1);
f87685c3 176 muscle_insert ("translate", obstack_finish (&format_obstack));
342b8b6e 177 XFREE (token_translations);
c3e23647
RS
178}
179
180
4a120d45 181static void
d2729d44 182output_gram (void)
c3e23647 183{
b2ed6e58
AD
184 {
185 int i;
186 short *values = XCALLOC (short, nrules + 1);
187 for (i = 0; i < nrules + 1; ++i)
1a2b5d37 188 values[i] = rules[i].rhs;
f87685c3 189 output_table_data (&format_obstack, values,
b2ed6e58
AD
190 0, 1, nrules + 1);
191 XFREE (values);
192 }
193
f87685c3 194 muscle_insert ("prhs", obstack_finish (&format_obstack));
342b8b6e 195
1e9798d5 196 {
3db472b9 197 short *yyrhs;
1e9798d5 198 int i;
c3e23647 199
3db472b9 200 yyrhs = XMALLOC (short, nritems);
c3e23647 201
3db472b9
AD
202 for (i = 1; i < nritems; ++i)
203 yyrhs[i] = ritem[i] >= 0 ? ritem[i] : -1;
c3e23647 204
f87685c3 205 output_table_data (&format_obstack, yyrhs,
3db472b9 206 ritem[0], 1, nritems);
f87685c3 207 muscle_insert ("rhs", obstack_finish (&format_obstack));
26f609ff 208
1e9798d5
AD
209 XFREE (yyrhs);
210 }
796d61fb 211
4ec8e00f
MA
212#if 0
213 if (!semantic_parser)
214 obstack_sgrow (&table_obstack, "\n#endif\n");
215#endif
c3e23647
RS
216}
217
218
4a120d45 219static void
d2729d44 220output_stos (void)
c3e23647 221{
9703cc49
AD
222 int i;
223 short *values = (short *) alloca (sizeof (short) * nstates);
224 for (i = 0; i < nstates; ++i)
f693ad14 225 values[i] = state_table[i]->accessing_symbol;
f87685c3 226 output_table_data (&format_obstack, values,
26f609ff 227 0, 1, nstates);
f87685c3 228 muscle_insert ("stos", obstack_finish (&format_obstack));
c3e23647
RS
229}
230
231
4a120d45 232static void
d2729d44 233output_rule_data (void)
c3e23647 234{
6c89f1c1
AD
235 int i;
236 int j;
1e9798d5 237 short *short_tab = NULL;
c3e23647 238
e41dc700
AD
239 {
240 short *values = XCALLOC (short, nrules + 1);
241 for (i = 0; i < nrules + 1; ++i)
1a2b5d37 242 values[i] = rules[i].line;
f87685c3 243 output_table_data (&format_obstack, values,
e41dc700 244 0, 1, nrules + 1);
f87685c3 245 muscle_insert ("rline", obstack_finish (&format_obstack));
e41dc700
AD
246 XFREE (values);
247 }
248
c3e23647 249
1e9798d5
AD
250 j = 0;
251 for (i = 0; i < nsyms; i++)
c3e23647 252 {
92790e5b
AD
253 /* Be sure not to use twice the same quotearg slot. */
254 const char *cp =
255 quotearg_n_style (1, c_quoting_style,
ad949da9 256 quotearg_style (escape_quoting_style, symbols[i]->tag));
1e9798d5
AD
257 /* Width of the next token, including the two quotes, the coma
258 and the space. */
92790e5b 259 int strsize = strlen (cp) + 2;
1e9798d5
AD
260
261 if (j + strsize > 75)
c3e23647 262 {
f87685c3 263 obstack_sgrow (&format_obstack, "\n ");
1e9798d5 264 j = 2;
c3e23647
RS
265 }
266
f87685c3
AD
267 obstack_sgrow (&format_obstack, cp);
268 obstack_sgrow (&format_obstack, ", ");
1e9798d5 269 j += strsize;
c3e23647 270 }
9ee3c97b 271 /* add a NULL entry to list of tokens */
f87685c3 272 obstack_sgrow (&format_obstack, "NULL");
c3e23647 273
26f609ff 274 /* Finish table and store. */
f87685c3
AD
275 obstack_1grow (&format_obstack, 0);
276 muscle_insert ("tname", obstack_finish (&format_obstack));
e372befa 277
9ee3c97b 278 /* Output YYTOKNUM. */
c03ae966
AD
279 {
280 short *values = XCALLOC (short, ntokens + 1);
281 for (i = 0; i < ntokens + 1; ++i)
282 values[i] = symbols[i]->user_token_number;
283 output_table_data (&format_obstack, values,
284 0, 1, ntokens + 1);
285 muscle_insert ("toknum", obstack_finish (&format_obstack));
286 XFREE (values);
287 }
288
e372befa 289
9ee3c97b 290 /* Output YYR1. */
b2ed6e58
AD
291 {
292 short *values = XCALLOC (short, nrules + 1);
293 for (i = 0; i < nrules + 1; ++i)
1a2b5d37 294 values[i] = rules[i].lhs;
f87685c3 295 output_table_data (&format_obstack, values,
b2ed6e58 296 0, 1, nrules + 1);
f87685c3 297 muscle_insert ("r1", obstack_finish (&format_obstack));
b2ed6e58
AD
298 XFREE (values);
299 }
d019d655 300
9ee3c97b 301 /* Output YYR2. */
1e9798d5 302 short_tab = XMALLOC (short, nrules + 1);
c3e23647 303 for (i = 1; i < nrules; i++)
1a2b5d37
AD
304 short_tab[i] = rules[i + 1].rhs - rules[i].rhs - 1;
305 short_tab[nrules] = nritems - rules[nrules].rhs - 1;
f87685c3 306 output_table_data (&format_obstack, short_tab,
26f609ff 307 0, 1, nrules + 1);
f87685c3 308 muscle_insert ("r2", obstack_finish (&format_obstack));
1e9798d5 309 XFREE (short_tab);
c3e23647
RS
310}
311
6c89f1c1
AD
312/*------------------------------------------------------------------.
313| Decide what to do for each type of token if seen as the lookahead |
314| token in specified state. The value returned is used as the |
315| default action (yydefact) for the state. In addition, actrow is |
316| filled with what to do for each kind of token, index by symbol |
317| number, with zero meaning do the default action. The value |
318| MINSHORT, a very negative number, means this situation is an |
319| error. The parser recognizes this value specially. |
320| |
321| This is where conflicts are resolved. The loop over lookahead |
322| rules considered lower-numbered rules last, and the last rule |
323| considered that likes a token gets to handle it. |
324`------------------------------------------------------------------*/
c3e23647 325
4a120d45 326static int
f9507c28 327action_row (state_t *state)
c3e23647 328{
6c89f1c1 329 int i;
837491d8 330 int default_rule = 0;
f9507c28 331 reductions *redp = state->reductions;
f9507c28
AD
332 shifts *shiftp = state->shifts;
333 errs *errp = state->errs;
837491d8
AD
334 /* set nonzero to inhibit having any default reduction */
335 int nodefault = 0;
c3e23647
RS
336
337 for (i = 0; i < ntokens; i++)
338 actrow[i] = 0;
339
80dac38c 340 if (redp->nreds >= 1)
c3e23647 341 {
837491d8
AD
342 int j;
343 /* loop over all the rules available here which require
344 lookahead */
f9507c28 345 for (i = state->nlookaheads - 1; i >= 0; --i)
837491d8
AD
346 /* and find each token which the rule finds acceptable
347 to come next */
348 for (j = 0; j < ntokens; j++)
349 /* and record this rule as the rule to use if that
350 token follows. */
f9507c28
AD
351 if (BITISSET (LA (state->lookaheadsp + i), j))
352 actrow[j] = -LAruleno[state->lookaheadsp + i];
c3e23647
RS
353 }
354
36281465
AD
355 /* Now see which tokens are allowed for shifts in this state. For
356 them, record the shift as the thing to do. So shift is preferred
357 to reduce. */
d954473d 358 for (i = 0; i < shiftp->nshifts; i++)
c3e23647 359 {
837491d8
AD
360 int symbol;
361 int shift_state = shiftp->shifts[i];
d954473d
AD
362 if (!shift_state)
363 continue;
c3e23647 364
f693ad14 365 symbol = state_table[shift_state]->accessing_symbol;
c3e23647 366
d954473d
AD
367 if (ISVAR (symbol))
368 break;
c3e23647 369
d954473d 370 actrow[symbol] = shift_state;
c3e23647 371
d954473d
AD
372 /* Do not use any default reduction if there is a shift for
373 error */
374 if (symbol == error_token_number)
375 nodefault = 1;
c3e23647
RS
376 }
377
36281465
AD
378 /* See which tokens are an explicit error in this state (due to
379 %nonassoc). For them, record MINSHORT as the action. */
2cec70b9
AD
380 for (i = 0; i < errp->nerrs; i++)
381 {
382 int symbol = errp->errs[i];
383 actrow[symbol] = MINSHORT;
384 }
c3e23647 385
36281465
AD
386 /* Now find the most common reduction and make it the default action
387 for this state. */
c3e23647 388
80dac38c 389 if (redp->nreds >= 1 && !nodefault)
c3e23647 390 {
f9507c28 391 if (state->consistent)
c3e23647
RS
392 default_rule = redp->rules[0];
393 else
394 {
7a5350ba 395 int max = 0;
f9507c28 396 for (i = 0; i < state->nlookaheads; i++)
c3e23647 397 {
7a5350ba 398 int count = 0;
f9507c28 399 int rule = -LAruleno[state->lookaheadsp + i];
837491d8 400 int j;
9ee3c97b 401
c3e23647 402 for (j = 0; j < ntokens; j++)
837491d8
AD
403 if (actrow[j] == rule)
404 count++;
9ee3c97b 405
c3e23647
RS
406 if (count > max)
407 {
408 max = count;
409 default_rule = rule;
410 }
411 }
9ee3c97b 412
c3e23647
RS
413 /* actions which match the default are replaced with zero,
414 which means "use the default" */
9ee3c97b 415
c3e23647
RS
416 if (max > 0)
417 {
837491d8 418 int j;
c3e23647 419 for (j = 0; j < ntokens; j++)
837491d8
AD
420 if (actrow[j] == default_rule)
421 actrow[j] = 0;
9ee3c97b 422
ceed8467 423 default_rule = -default_rule;
c3e23647
RS
424 }
425 }
426 }
427
428 /* If have no default rule, the default is an error.
429 So replace any action which says "error" with "use default". */
430
431 if (default_rule == 0)
837491d8
AD
432 for (i = 0; i < ntokens; i++)
433 if (actrow[i] == MINSHORT)
434 actrow[i] = 0;
c3e23647 435
36281465 436 return default_rule;
c3e23647
RS
437}
438
439
4a120d45 440static void
d2729d44 441save_row (int state)
c3e23647 442{
6c89f1c1
AD
443 int i;
444 int count;
445 short *sp;
446 short *sp1;
447 short *sp2;
c3e23647
RS
448
449 count = 0;
450 for (i = 0; i < ntokens; i++)
796d61fb
AD
451 if (actrow[i] != 0)
452 count++;
c3e23647
RS
453
454 if (count == 0)
455 return;
456
d7913476
AD
457 froms[state] = sp1 = sp = XCALLOC (short, count);
458 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
459
460 for (i = 0; i < ntokens; i++)
796d61fb
AD
461 if (actrow[i] != 0)
462 {
463 *sp1++ = i;
464 *sp2++ = actrow[i];
465 }
c3e23647
RS
466
467 tally[state] = count;
468 width[state] = sp1[-1] - sp[0] + 1;
469}
470
471
6c89f1c1
AD
472/*------------------------------------------------------------------.
473| Figure out the actions for the specified state, indexed by |
474| lookahead token type. |
475| |
f2acea59
AD
476| The YYDEFACT table is output now. The detailed info is saved for |
477| putting into YYTABLE later. |
6c89f1c1 478`------------------------------------------------------------------*/
c3e23647 479
4a120d45 480static void
6c89f1c1 481token_actions (void)
c3e23647 482{
6c89f1c1 483 int i;
d7913476 484 short *yydefact = XCALLOC (short, nstates);
c3e23647 485
d7913476 486 actrow = XCALLOC (short, ntokens);
f2acea59 487 for (i = 0; i < nstates; ++i)
c3e23647 488 {
f9507c28 489 yydefact[i] = action_row (state_table[i]);
6c89f1c1 490 save_row (i);
c3e23647 491 }
bbb5bcc6 492
f87685c3 493 output_table_data (&format_obstack, yydefact,
26f609ff 494 yydefact[0], 1, nstates);
f87685c3 495 muscle_insert ("defact", obstack_finish (&format_obstack));
342b8b6e 496
26f609ff 497 XFREE (actrow);
d7913476 498 XFREE (yydefact);
c3e23647
RS
499}
500
501
3f96f4dc
AD
502/*-----------------------------.
503| Output the actions to OOUT. |
504`-----------------------------*/
505
506static void
f0440388 507actions_output (FILE *out, size_t *line)
3f96f4dc
AD
508{
509 int rule;
510 for (rule = 1; rule < nrules + 1; ++rule)
1a2b5d37 511 if (rules[rule].action)
3f96f4dc 512 {
ea52d706 513 fprintf (out, " case %d:\n", rule);
3f96f4dc
AD
514
515 if (!no_lines_flag)
ea52d706 516 fprintf (out, muscle_find ("linef"),
1a2b5d37 517 rules[rule].action_line,
ea52d706
AD
518 quotearg_style (c_quoting_style,
519 muscle_find ("filename")));
3f96f4dc
AD
520 /* As a Bison extension, add the ending semicolon. Since some
521 Yacc don't do that, help people using bison as a Yacc
522 finding their missing semicolons. */
ea52d706 523 fprintf (out, "{ %s%s }\n break;\n\n",
1a2b5d37 524 rules[rule].action,
ea52d706 525 yacc_flag ? ";" : "");
f0440388 526
fbc8ecb7
MA
527 /* We always output 4 '\n' per action. */
528 *line += 4;
529 /* Plus one if !no_lines_flag. */
530 if (!no_lines_flag)
531 ++*line;
f0440388 532 /* Get the number of lines written by the user. */
1a2b5d37 533 *line += get_lines_number (rules[rule].action);
3f96f4dc
AD
534 }
535}
536
537
f499b062
AD
538/*----------------------------.
539| Output the guards to OOUT. |
540`----------------------------*/
541
542static void
543guards_output (FILE *out, size_t *line)
544{
545 int rule;
546 for (rule = 1; rule < nrules + 1; ++rule)
1a2b5d37 547 if (rules[rule].action)
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 /* We always output 4 '\n' per action. */
560 *line += 4;
561 /* Plus one if !no_lines_flag. */
562 if (!no_lines_flag)
563 ++*line;
564 /* Get the number of lines written by the user. */
1a2b5d37 565 *line += get_lines_number (rules[rule].guard);
f499b062
AD
566 }
567}
568
569
4a120d45 570static void
d2729d44 571save_column (int symbol, int default_state)
c3e23647 572{
6c89f1c1 573 int i;
6c89f1c1
AD
574 short *sp;
575 short *sp1;
576 short *sp2;
577 int count;
837491d8 578 int symno = symbol - ntokens + nstates;
c3e23647 579
43591cec
AD
580 short begin = goto_map[symbol];
581 short end = goto_map[symbol + 1];
c3e23647
RS
582
583 count = 0;
43591cec 584 for (i = begin; i < end; i++)
796d61fb
AD
585 if (to_state[i] != default_state)
586 count++;
c3e23647
RS
587
588 if (count == 0)
589 return;
590
d7913476
AD
591 froms[symno] = sp1 = sp = XCALLOC (short, count);
592 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 593
43591cec 594 for (i = begin; i < end; i++)
796d61fb
AD
595 if (to_state[i] != default_state)
596 {
597 *sp1++ = from_state[i];
598 *sp2++ = to_state[i];
599 }
c3e23647
RS
600
601 tally[symno] = count;
602 width[symno] = sp1[-1] - sp[0] + 1;
603}
604
6c89f1c1
AD
605static int
606default_goto (int symbol)
607{
608 int i;
837491d8
AD
609 int m = goto_map[symbol];
610 int n = goto_map[symbol + 1];
611 int default_state = -1;
612 int max = 0;
6c89f1c1
AD
613
614 if (m == n)
615 return -1;
616
617 for (i = 0; i < nstates; i++)
618 state_count[i] = 0;
619
620 for (i = m; i < n; i++)
621 state_count[to_state[i]]++;
622
6c89f1c1 623 for (i = 0; i < nstates; i++)
796d61fb
AD
624 if (state_count[i] > max)
625 {
626 max = state_count[i];
627 default_state = i;
628 }
6c89f1c1
AD
629
630 return default_state;
631}
632
633
634/*-------------------------------------------------------------------.
635| Figure out what to do after reducing with each rule, depending on |
636| the saved state from before the beginning of parsing the data that |
637| matched this rule. |
638| |
639| The YYDEFGOTO table is output now. The detailed info is saved for |
640| putting into YYTABLE later. |
641`-------------------------------------------------------------------*/
642
643static void
644goto_actions (void)
645{
43591cec 646 int i;
bbb5bcc6 647 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 648
26f609ff 649 state_count = XCALLOC (short, nstates);
43591cec 650 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 651 {
43591cec
AD
652 int default_state = default_goto (i);
653 save_column (i, default_state);
654 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
655 }
656
f87685c3 657 output_table_data (&format_obstack, yydefgoto,
26f609ff 658 yydefgoto[0], 1, nsyms - ntokens);
f87685c3 659 muscle_insert ("defgoto", obstack_finish (&format_obstack));
43591cec 660
d7913476 661 XFREE (state_count);
43591cec 662 XFREE (yydefgoto);
6c89f1c1 663}
c3e23647
RS
664
665
9ee3c97b
AD
666/* The next few functions decide how to pack the actions and gotos
667 information into yytable. */
c3e23647 668
4a120d45 669static void
d2729d44 670sort_actions (void)
c3e23647 671{
6c89f1c1 672 int i;
c3e23647 673
d7913476 674 order = XCALLOC (short, nvectors);
c3e23647
RS
675 nentries = 0;
676
677 for (i = 0; i < nvectors; i++)
796d61fb
AD
678 if (tally[i] > 0)
679 {
837491d8
AD
680 int k;
681 int t = tally[i];
682 int w = width[i];
683 int j = nentries - 1;
c3e23647 684
796d61fb
AD
685 while (j >= 0 && (width[order[j]] < w))
686 j--;
c3e23647 687
796d61fb
AD
688 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
689 j--;
c3e23647 690
796d61fb
AD
691 for (k = nentries - 1; k > j; k--)
692 order[k + 1] = order[k];
c3e23647 693
796d61fb
AD
694 order[j + 1] = i;
695 nentries++;
696 }
c3e23647
RS
697}
698
699
4a120d45 700static int
d2729d44 701matching_state (int vector)
c3e23647 702{
837491d8 703 int i = order[vector];
6c89f1c1
AD
704 int t;
705 int w;
6c89f1c1 706 int prev;
c3e23647 707
c3e23647 708 if (i >= nstates)
36281465 709 return -1;
c3e23647
RS
710
711 t = tally[i];
712 w = width[i];
713
714 for (prev = vector - 1; prev >= 0; prev--)
715 {
837491d8
AD
716 int j = order[prev];
717 int k;
718 int match = 1;
719
c3e23647 720 if (width[j] != w || tally[j] != t)
36281465 721 return -1;
c3e23647 722
c3e23647 723 for (k = 0; match && k < t; k++)
796d61fb
AD
724 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
725 match = 0;
c3e23647
RS
726
727 if (match)
36281465 728 return j;
c3e23647
RS
729 }
730
36281465 731 return -1;
c3e23647
RS
732}
733
734
4a120d45 735static int
d2729d44 736pack_vector (int vector)
c3e23647 737{
837491d8 738 int i = order[vector];
6c89f1c1 739 int j;
837491d8 740 int t = tally[i];
6c89f1c1 741 int loc = 0;
837491d8
AD
742 short *from = froms[i];
743 short *to = tos[i];
c3e23647 744
340ef489 745 assert (t);
c3e23647 746
c3e23647
RS
747 for (j = lowzero - from[0]; j < MAXTABLE; j++)
748 {
837491d8
AD
749 int k;
750 int ok = 1;
c3e23647
RS
751
752 for (k = 0; ok && k < t; k++)
753 {
754 loc = j + from[k];
755 if (loc > MAXTABLE)
a0f6b076 756 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
c3e23647
RS
757
758 if (table[loc] != 0)
759 ok = 0;
760 }
761
762 for (k = 0; ok && k < vector; k++)
796d61fb
AD
763 if (pos[k] == j)
764 ok = 0;
c3e23647
RS
765
766 if (ok)
767 {
768 for (k = 0; k < t; k++)
769 {
770 loc = j + from[k];
771 table[loc] = to[k];
772 check[loc] = from[k];
773 }
774
775 while (table[lowzero] != 0)
776 lowzero++;
777
778 if (loc > high)
779 high = loc;
780
36281465 781 return j;
c3e23647
RS
782 }
783 }
275fc3ad
AD
784#define pack_vector_succeeded 0
785 assert (pack_vector_succeeded);
3843c413 786 return 0;
c3e23647
RS
787}
788
789
6c89f1c1
AD
790static void
791pack_table (void)
792{
793 int i;
794 int place;
795 int state;
796
d7913476
AD
797 base = XCALLOC (short, nvectors);
798 pos = XCALLOC (short, nentries);
799 table = XCALLOC (short, MAXTABLE);
800 check = XCALLOC (short, MAXTABLE);
6c89f1c1
AD
801
802 lowzero = 0;
803 high = 0;
804
805 for (i = 0; i < nvectors; i++)
806 base[i] = MINSHORT;
807
808 for (i = 0; i < MAXTABLE; i++)
809 check[i] = -1;
810
811 for (i = 0; i < nentries; i++)
812 {
813 state = matching_state (i);
814
815 if (state < 0)
816 place = pack_vector (i);
817 else
818 place = base[state];
819
820 pos[i] = place;
821 base[order[i]] = place;
822 }
823
824 for (i = 0; i < nvectors; i++)
825 {
796d61fb
AD
826 XFREE (froms[i]);
827 XFREE (tos[i]);
6c89f1c1
AD
828 }
829
d7913476
AD
830 XFREE (froms);
831 XFREE (tos);
832 XFREE (pos);
6c89f1c1 833}
c3e23647
RS
834
835/* the following functions output yytable, yycheck
836 and the vectors whose elements index the portion starts */
837
4a120d45 838static void
d2729d44 839output_base (void)
c3e23647 840{
26f609ff 841 /* Output pact. */
f87685c3 842 output_table_data (&format_obstack, base,
26f609ff 843 base[0], 1, nstates);
f87685c3 844 muscle_insert ("pact", obstack_finish (&format_obstack));
c3e23647 845
26f609ff 846 /* Output pgoto. */
f87685c3 847 output_table_data (&format_obstack, base,
26f609ff 848 base[nstates], nstates + 1, nvectors);
f87685c3 849 muscle_insert ("pgoto", obstack_finish (&format_obstack));
c3e23647 850
d7913476 851 XFREE (base);
c3e23647
RS
852}
853
854
4a120d45 855static void
d2729d44 856output_table (void)
c3e23647 857{
f87685c3 858 output_table_data (&format_obstack, table,
26f609ff 859 table[0], 1, high + 1);
f87685c3 860 muscle_insert ("table", obstack_finish (&format_obstack));
d7913476 861 XFREE (table);
c3e23647
RS
862}
863
864
4a120d45 865static void
d2729d44 866output_check (void)
c3e23647 867{
f87685c3 868 output_table_data (&format_obstack, check,
26f609ff 869 check[0], 1, high + 1);
f87685c3 870 muscle_insert ("check", obstack_finish (&format_obstack));
d7913476 871 XFREE (check);
c3e23647
RS
872}
873
6c89f1c1
AD
874/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
875 and yycheck. */
876
877static void
878output_actions (void)
879{
49701457 880 int i;
6c89f1c1 881 nvectors = nstates + nvars;
c3e23647 882
d7913476
AD
883 froms = XCALLOC (short *, nvectors);
884 tos = XCALLOC (short *, nvectors);
885 tally = XCALLOC (short, nvectors);
886 width = XCALLOC (short, nvectors);
6c89f1c1
AD
887
888 token_actions ();
d7913476
AD
889 XFREE (LA);
890 XFREE (LAruleno);
6c89f1c1
AD
891
892 goto_actions ();
d7913476
AD
893 XFREE (goto_map + ntokens);
894 XFREE (from_state);
895 XFREE (to_state);
6c89f1c1
AD
896
897 sort_actions ();
898 pack_table ();
4e5caae2 899
6c89f1c1
AD
900 output_base ();
901 output_table ();
4e5caae2 902
6c89f1c1 903 output_check ();
49701457
AD
904
905 for (i = 0; i < nstates; ++i)
906 {
2cec70b9 907 free (state_table[i]->shifts);
49701457 908 XFREE (state_table[i]->reductions);
2cec70b9 909 free (state_table[i]->errs);
49701457
AD
910 free (state_table[i]);
911 }
9703cc49 912 XFREE (state_table);
6c89f1c1 913}
c3e23647 914
652def80
MA
915\f
916/*------------------------------------------------------------.
917| Copy the parser code from SKEL_FILENAME into OOUT obstack. |
918| and do the muscle substitution. |
919`------------------------------------------------------------*/
c3e23647 920
4a120d45 921static void
ea52d706 922output_parser (const char *skel_filename, FILE *out)
c3e23647 923{
6c89f1c1 924 int c;
ff61dabd 925 FILE *fskel;
897668ee
MA
926 size_t output_line;
927 size_t skeleton_line;
c3e23647 928
652def80 929 fskel = xfopen (skel_filename, "r");
ef7ddedd 930
e8cb70b9 931 /* New output code. */
897668ee
MA
932 output_line = 1;
933 skeleton_line = 1;
26f609ff
RA
934 c = getc (fskel);
935 while (c != EOF)
c3e23647 936 {
26f609ff 937 if (c != '%')
573c1d9f 938 {
26f609ff 939 if (c == '\n')
897668ee
MA
940 {
941 ++output_line;
942 ++skeleton_line;
943 }
ea52d706 944 putc (c, out);
26f609ff 945 c = getc (fskel);
bbb5bcc6 946 }
26f609ff 947 else if ((c = getc (fskel)) == '%')
bbb5bcc6 948 {
11d82f03
MA
949 /* Read the muscle. */
950 const char *muscle_key = 0;
951 const char *muscle_value = 0;
652def80 952
5b5d1929 953 while (isalnum (c = getc (fskel)) || c == '-')
11d82f03
MA
954 obstack_1grow (&muscle_obstack, c);
955 obstack_1grow (&muscle_obstack, 0);
26f609ff 956
e8cb70b9 957 /* Output the right value, or see if it's something special. */
11d82f03
MA
958 muscle_key = obstack_finish (&muscle_obstack);
959 muscle_value = muscle_find (muscle_key);
3f96f4dc 960 if (!strcmp (muscle_key, "actions"))
897668ee 961 actions_output (out, &output_line);
f499b062
AD
962 else if (!strcmp (muscle_key, "guards"))
963 guards_output (out, &output_line);
11d82f03 964 else if (!strcmp (muscle_key, "line"))
897668ee
MA
965 fprintf (out, "%d", output_line);
966 else if (!strcmp (muscle_key, "skeleton-line"))
967 fprintf (out, "%d", skeleton_line);
3f96f4dc 968 else if (muscle_value)
f0440388
MA
969 {
970 fputs (muscle_value, out);
897668ee 971 output_line += get_lines_number (muscle_value);
1fa14068 972 }
bbb5bcc6 973 else
26f609ff 974 {
ea52d706
AD
975 fputs ("%%", out);
976 fputs (muscle_key, out);
26f609ff 977 }
573c1d9f 978 }
b0cfa28a 979 else
ea52d706 980 putc ('%', out);
bbb5bcc6 981 }
26f609ff 982
e8cb70b9 983 /* End. */
ff61dabd 984 xfclose (fskel);
c3e23647
RS
985}
986
652def80
MA
987/*----------------------------------------.
988| Prepare the master parser to be output |
989`----------------------------------------*/
990
991static void
992output_master_parser (void)
993{
ea52d706 994 FILE *parser = xfopen (parser_file_name, "w");
652def80
MA
995 if (!skeleton)
996 {
997 if (semantic_parser)
998 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
999 else
1000 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
1001 }
3843c413 1002 muscle_insert ("skeleton", skeleton);
f0440388 1003 muscle_insert ("parser-file-name", parser_file_name);
ea52d706
AD
1004
1005 output_parser (skeleton, parser);
1006 xfclose (parser);
652def80
MA
1007}
1008
1009
26f609ff
RA
1010/* FIXME. */
1011
11d82f03
MA
1012#define MUSCLE_INSERT_INT(Key, Value) \
1013{ \
1014 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1015 obstack_1grow (&muscle_obstack, 0); \
1016 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1017}
1018
11d82f03
MA
1019#define MUSCLE_INSERT_STRING(Key, Value) \
1020{ \
1021 obstack_sgrow (&muscle_obstack, Value); \
1022 obstack_1grow (&muscle_obstack, 0); \
1023 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1024}
1025
11d82f03 1026#define MUSCLE_INSERT_PREFIX(Key, Value) \
26f609ff 1027{ \
11d82f03
MA
1028 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1029 obstack_1grow (&muscle_obstack, 0); \
1030 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1031}
1032
1033static void
1034prepare (void)
1035{
11d82f03
MA
1036 MUSCLE_INSERT_INT ("last", high);
1037 MUSCLE_INSERT_INT ("flag", MINSHORT);
1038 MUSCLE_INSERT_INT ("pure", pure_parser);
1039 MUSCLE_INSERT_INT ("nsym", nsyms);
1040 MUSCLE_INSERT_INT ("debug", debug_flag);
1041 MUSCLE_INSERT_INT ("final", final_state);
1042 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
c7925b99 1043 MUSCLE_INSERT_INT ("error-verbose", error_verbose);
78af9bbc 1044 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
11d82f03
MA
1045
1046 MUSCLE_INSERT_INT ("nnts", nvars);
1047 MUSCLE_INSERT_INT ("nrules", nrules);
1048 MUSCLE_INSERT_INT ("nstates", nstates);
1049 MUSCLE_INSERT_INT ("ntokens", ntokens);
1050
5b5d1929 1051 MUSCLE_INSERT_INT ("locations-flag", locations_flag);
26f609ff 1052}
c3e23647 1053
93ede233
AD
1054
1055/*-------------------------.
1056| Output the header file. |
1057`-------------------------*/
1058
1059static void
1060header_output (void)
1061{
1062 FILE *out = xfopen (spec_defines_file, "w");
1063 char *macro_name = compute_header_macro ();
1064
1065 fprintf (out, "#ifndef %s\n", macro_name);
1066 fprintf (out, "# define %s\n\n", macro_name);
1067
1068 fputs (muscle_find ("tokendef"), out);
1069 fprintf (out, "\
1070#ifndef YYSTYPE\n\
1071typedef %s
1072yystype;\n\
1073# define YYSTYPE yystype\n\
1074#endif\n",
1075 muscle_find ("stype"));
1076
1077 if (!pure_parser)
1078 fprintf (out, "\nextern YYSTYPE %slval;\n",
1079 spec_name_prefix);
1080 if (semantic_parser)
1081 {
1082 int i;
1083
1084 for (i = ntokens; i < nsyms; i++)
1085 /* don't make these for dummy nonterminals made by gensym. */
ad949da9
AD
1086 if (*symbols[i]->tag != '@')
1087 fprintf (out, "# define NT%s\t%d\n", symbols[i]->tag, i);
93ede233
AD
1088 }
1089
1090 fprintf (out, "\n#endif /* not %s */\n", macro_name);
1091 free (macro_name);
1092 xfclose (out);
1093}
1094
1095
6c89f1c1
AD
1096/*----------------------------------------------------------.
1097| Output the parsing tables and the parser code to ftable. |
1098`----------------------------------------------------------*/
c3e23647 1099
6c89f1c1
AD
1100void
1101output (void)
1102{
f87685c3 1103 obstack_init (&format_obstack);
dd60faec 1104
6c89f1c1 1105 output_token_translations ();
6c89f1c1 1106 output_gram ();
26f609ff 1107
d7913476 1108 XFREE (ritem);
6c89f1c1
AD
1109 if (semantic_parser)
1110 output_stos ();
1111 output_rule_data ();
1112 output_actions ();
342b8b6e 1113
26f609ff 1114 prepare ();
d1a2daf7 1115 /* Copy definitions in directive. */
5449dd0f 1116 obstack_1grow (&attrs_obstack, 0);
11d82f03 1117 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
652def80 1118
93ede233 1119 /* Output the parser. */
652def80 1120 output_master_parser ();
93ede233
AD
1121 /* Output the header if needed. */
1122 if (defines_flag)
1123 header_output ();
26f609ff 1124
1a2b5d37 1125 free (rules + 1);
f499b062
AD
1126 obstack_free (&muscle_obstack, NULL);
1127 obstack_free (&format_obstack, NULL);
1128 obstack_free (&action_obstack, NULL);
f499b062 1129 obstack_free (&attrs_obstack, NULL);
c3e23647 1130}