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