]> git.saurik.com Git - bison.git/blame - src/output.c
* src/state.h (SHIFT_DISABLE, SHIFT_IS_DISABLED): New.
[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"
8c7ebe49 94#include "obstack.h"
14d3eb9b 95#include "quotearg.h"
ceed8467 96#include "getargs.h"
c3e23647
RS
97#include "files.h"
98#include "gram.h"
b2ca4022 99#include "LR0.h"
a0f6b076 100#include "complain.h"
6c89f1c1 101#include "output.h"
720d742f 102#include "lalr.h"
a70083a3 103#include "reader.h"
0619caf0 104#include "conflicts.h"
11d82f03 105#include "muscle_tab.h"
c3e23647 106
d019d655
AD
107extern void berror PARAMS((const char *));
108
c3e23647
RS
109static int nvectors;
110static int nentries;
342b8b6e
AD
111static short **froms = NULL;
112static short **tos = NULL;
113static short *tally = NULL;
114static short *width = NULL;
115static short *actrow = NULL;
116static short *state_count = NULL;
117static short *order = NULL;
118static short *base = NULL;
119static short *pos = NULL;
120static short *table = NULL;
121static short *check = NULL;
c3e23647
RS
122static int lowzero;
123static int high;
124
11d82f03 125struct obstack muscle_obstack;
26f609ff 126struct obstack output_obstack;
c3e23647 127
c7925b99
MA
128int error_verbose = 0;
129
26f609ff 130/* FIXME. */
c3e23647 131
d019d655 132static inline void
342b8b6e
AD
133output_table_data (struct obstack *oout,
134 short *table_data,
135 short first,
136 short begin,
26f609ff 137 short end)
d019d655 138{
26f609ff
RA
139 int i;
140 int j = 1;
342b8b6e 141
26f609ff
RA
142 obstack_fgrow1 (oout, "%6d", first);
143 for (i = begin; i < end; ++i)
d019d655 144 {
896fe5c1 145 obstack_1grow (oout, ',');
d019d655
AD
146 if (j >= 10)
147 {
ff4423cc 148 obstack_sgrow (oout, "\n ");
d019d655
AD
149 j = 1;
150 }
151 else
26f609ff 152 ++j;
8f451ef7 153 obstack_fgrow1 (oout, "%6d", table_data[i]);
c3e23647 154 }
26f609ff 155 obstack_1grow (oout, 0);
c3e23647
RS
156}
157
158
4a120d45 159static void
d2729d44 160output_token_translations (void)
c3e23647 161{
342b8b6e 162 output_table_data (&output_obstack, token_translations,
26f609ff 163 0, 1, max_user_token_number + 1);
11d82f03 164 muscle_insert ("translate", obstack_finish (&output_obstack));
342b8b6e 165 XFREE (token_translations);
c3e23647
RS
166}
167
168
4a120d45 169static void
d2729d44 170output_gram (void)
c3e23647 171{
b2ed6e58
AD
172 {
173 int i;
174 short *values = XCALLOC (short, nrules + 1);
175 for (i = 0; i < nrules + 1; ++i)
176 values[i] = rule_table[i].rhs;
177 output_table_data (&output_obstack, values,
178 0, 1, nrules + 1);
179 XFREE (values);
180 }
181
11d82f03 182 muscle_insert ("prhs", obstack_finish (&output_obstack));
342b8b6e 183
1e9798d5
AD
184 {
185 size_t yyrhs_size = 1;
186 short *yyrhs, *sp;
187 int i;
c3e23647 188
1e9798d5
AD
189 for (sp = ritem + 1; *sp; sp++)
190 ++yyrhs_size;
191 yyrhs = XMALLOC (short, yyrhs_size);
c3e23647 192
1e9798d5
AD
193 for (sp = ritem + 1, i = 1; *sp; ++sp, ++i)
194 yyrhs[i] = *sp > 0 ? *sp : 0;
c3e23647 195
342b8b6e 196 output_table_data (&output_obstack, yyrhs,
26f609ff 197 ritem[0], 1, yyrhs_size);
11d82f03 198 muscle_insert ("rhs", obstack_finish (&output_obstack));
26f609ff 199
1e9798d5
AD
200 XFREE (yyrhs);
201 }
c3e23647 202
4e5caae2
MA
203#if 0
204 if (!semantic_parser && !no_parser_flag)
205 obstack_sgrow (&table_obstack, "\n#endif\n");
206#endif
c3e23647
RS
207}
208
209
4a120d45 210static void
d2729d44 211output_stos (void)
c3e23647 212{
9703cc49
AD
213 int i;
214 short *values = (short *) alloca (sizeof (short) * nstates);
215 for (i = 0; i < nstates; ++i)
216 values[i] = state_table[i].accessing_symbol;
217 output_table_data (&output_obstack, values,
26f609ff 218 0, 1, nstates);
11d82f03 219 muscle_insert ("stos", obstack_finish (&output_obstack));
c3e23647
RS
220}
221
222
4a120d45 223static void
d2729d44 224output_rule_data (void)
c3e23647 225{
6c89f1c1
AD
226 int i;
227 int j;
1e9798d5 228 short *short_tab = NULL;
c3e23647 229
e41dc700
AD
230 {
231 short *values = XCALLOC (short, nrules + 1);
232 for (i = 0; i < nrules + 1; ++i)
233 values[i] = rule_table[i].line;
234 output_table_data (&output_obstack, values,
235 0, 1, nrules + 1);
236 muscle_insert ("rline", obstack_finish (&output_obstack));
237 XFREE (values);
238 }
239
c3e23647 240
1e9798d5
AD
241 j = 0;
242 for (i = 0; i < nsyms; i++)
ceed8467
AD
243 /* this used to be i<=nsyms, but that output a final "" symbol
244 almost by accident */
c3e23647 245 {
1e9798d5
AD
246 /* Width of the next token, including the two quotes, the coma
247 and the space. */
248 int strsize = 4;
6c89f1c1 249 char *p;
c3e23647 250
1e9798d5
AD
251 for (p = tags[i]; p && *p; p++)
252 if (*p == '"' || *p == '\\' || *p == '\n' || *p == '\t'
253 || *p == '\b')
254 strsize += 2;
255 else if (*p < 040 || *p >= 0177)
256 strsize += 4;
257 else
258 strsize++;
259
260 if (j + strsize > 75)
c3e23647 261 {
26f609ff 262 obstack_sgrow (&output_obstack, "\n ");
1e9798d5 263 j = 2;
c3e23647
RS
264 }
265
26f609ff 266 obstack_1grow (&output_obstack, '\"');
c3e23647
RS
267 for (p = tags[i]; p && *p; p++)
268 {
269 if (*p == '"' || *p == '\\')
26f609ff 270 obstack_fgrow1 (&output_obstack, "\\%c", *p);
c3e23647 271 else if (*p == '\n')
26f609ff 272 obstack_sgrow (&output_obstack, "\\n");
c3e23647 273 else if (*p == '\t')
26f609ff 274 obstack_sgrow (&output_obstack, "\\t");
c3e23647 275 else if (*p == '\b')
26f609ff 276 obstack_sgrow (&output_obstack, "\\b");
c3e23647 277 else if (*p < 040 || *p >= 0177)
26f609ff 278 obstack_fgrow1 (&output_obstack, "\\%03o", *p);
c3e23647 279 else
26f609ff 280 obstack_1grow (&output_obstack, *p);
c3e23647
RS
281 }
282
26f609ff 283 obstack_sgrow (&output_obstack, "\", ");
1e9798d5 284 j += strsize;
c3e23647 285 }
9ee3c97b 286 /* add a NULL entry to list of tokens */
26f609ff 287 obstack_sgrow (&output_obstack, "NULL");
c3e23647 288
26f609ff
RA
289 /* Finish table and store. */
290 obstack_1grow (&output_obstack, 0);
11d82f03 291 muscle_insert ("tname", obstack_finish (&output_obstack));
e372befa 292
9ee3c97b 293 /* Output YYTOKNUM. */
26f609ff
RA
294 output_table_data (&output_obstack, user_toknums,
295 0, 1, ntokens + 1);
11d82f03 296 muscle_insert ("toknum", obstack_finish (&output_obstack));
e372befa 297
9ee3c97b 298 /* Output YYR1. */
b2ed6e58
AD
299 {
300 short *values = XCALLOC (short, nrules + 1);
301 for (i = 0; i < nrules + 1; ++i)
302 values[i] = rule_table[i].lhs;
303 output_table_data (&output_obstack, values,
304 0, 1, nrules + 1);
305 muscle_insert ("r1", obstack_finish (&output_obstack));
306 XFREE (values);
307 }
d019d655 308
9ee3c97b 309 /* Output YYR2. */
1e9798d5 310 short_tab = XMALLOC (short, nrules + 1);
c3e23647 311 for (i = 1; i < nrules; i++)
b2ed6e58
AD
312 short_tab[i] = rule_table[i + 1].rhs - rule_table[i].rhs - 1;
313 short_tab[nrules] = nitems - rule_table[nrules].rhs - 1;
342b8b6e 314 output_table_data (&output_obstack, short_tab,
26f609ff 315 0, 1, nrules + 1);
11d82f03 316 muscle_insert ("r2", obstack_finish (&output_obstack));
1e9798d5 317 XFREE (short_tab);
c3e23647 318
b2ed6e58 319 XFREE (rule_table + 1);
c3e23647
RS
320}
321
6c89f1c1
AD
322/*------------------------------------------------------------------.
323| Decide what to do for each type of token if seen as the lookahead |
324| token in specified state. The value returned is used as the |
325| default action (yydefact) for the state. In addition, actrow is |
326| filled with what to do for each kind of token, index by symbol |
327| number, with zero meaning do the default action. The value |
328| MINSHORT, a very negative number, means this situation is an |
329| error. The parser recognizes this value specially. |
330| |
331| This is where conflicts are resolved. The loop over lookahead |
332| rules considered lower-numbered rules last, and the last rule |
333| considered that likes a token gets to handle it. |
334`------------------------------------------------------------------*/
c3e23647 335
4a120d45 336static int
d2729d44 337action_row (int state)
c3e23647 338{
6c89f1c1
AD
339 int i;
340 int j;
341 int k;
342 int m = 0;
343 int n = 0;
344 int count;
345 int default_rule;
346 int nreds;
347 int max;
348 int rule;
349 int shift_state;
350 int symbol;
351 unsigned mask;
352 unsigned *wordp;
353 reductions *redp;
354 shifts *shiftp;
355 errs *errp;
ceed8467 356 int nodefault = 0; /* set nonzero to inhibit having any default reduction */
c3e23647
RS
357
358 for (i = 0; i < ntokens; i++)
359 actrow[i] = 0;
360
361 default_rule = 0;
362 nreds = 0;
90b4416b 363 redp = state_table[state].reduction_table;
c3e23647
RS
364
365 if (redp)
366 {
367 nreds = redp->nreds;
368
369 if (nreds >= 1)
370 {
36281465
AD
371 /* loop over all the rules available here which require
372 lookahead */
f004bf6a
AD
373 m = state_table[state].lookaheads;
374 n = state_table[state + 1].lookaheads;
c3e23647
RS
375
376 for (i = n - 1; i >= m; i--)
377 {
ceed8467 378 rule = -LAruleno[i];
bb527fc2 379 wordp = LA (i);
c3e23647
RS
380 mask = 1;
381
36281465 382 /* and find each token which the rule finds acceptable
ceed8467 383 to come next */
c3e23647
RS
384 for (j = 0; j < ntokens; j++)
385 {
36281465
AD
386 /* and record this rule as the rule to use if that
387 token follows. */
c3e23647
RS
388 if (mask & *wordp)
389 actrow[j] = rule;
390
391 mask <<= 1;
392 if (mask == 0)
393 {
394 mask = 1;
395 wordp++;
396 }
397 }
398 }
399 }
400 }
401
90b4416b 402 shiftp = state_table[state].shift_table;
c3e23647 403
36281465
AD
404 /* Now see which tokens are allowed for shifts in this state. For
405 them, record the shift as the thing to do. So shift is preferred
406 to reduce. */
c3e23647
RS
407
408 if (shiftp)
409 {
410 k = shiftp->nshifts;
411
412 for (i = 0; i < k; i++)
413 {
414 shift_state = shiftp->shifts[i];
ceed8467
AD
415 if (!shift_state)
416 continue;
c3e23647 417
9703cc49 418 symbol = state_table[shift_state].accessing_symbol;
c3e23647 419
ceed8467 420 if (ISVAR (symbol))
c3e23647
RS
421 break;
422
423 actrow[symbol] = shift_state;
424
36281465
AD
425 /* Do not use any default reduction if there is a shift for
426 error */
427 if (symbol == error_token_number)
428 nodefault = 1;
c3e23647
RS
429 }
430 }
431
432 errp = err_table[state];
433
36281465
AD
434 /* See which tokens are an explicit error in this state (due to
435 %nonassoc). For them, record MINSHORT as the action. */
c3e23647
RS
436
437 if (errp)
438 {
439 k = errp->nerrs;
440
441 for (i = 0; i < k; i++)
442 {
443 symbol = errp->errs[i];
444 actrow[symbol] = MINSHORT;
445 }
446 }
447
36281465
AD
448 /* Now find the most common reduction and make it the default action
449 for this state. */
c3e23647 450
ceed8467 451 if (nreds >= 1 && !nodefault)
c3e23647 452 {
de326cc0 453 if (state_table[state].consistent)
c3e23647
RS
454 default_rule = redp->rules[0];
455 else
456 {
457 max = 0;
458 for (i = m; i < n; i++)
459 {
460 count = 0;
ceed8467 461 rule = -LAruleno[i];
9ee3c97b 462
c3e23647
RS
463 for (j = 0; j < ntokens; j++)
464 {
465 if (actrow[j] == rule)
466 count++;
467 }
9ee3c97b 468
c3e23647
RS
469 if (count > max)
470 {
471 max = count;
472 default_rule = rule;
473 }
474 }
9ee3c97b 475
c3e23647
RS
476 /* actions which match the default are replaced with zero,
477 which means "use the default" */
9ee3c97b 478
c3e23647
RS
479 if (max > 0)
480 {
481 for (j = 0; j < ntokens; j++)
482 {
483 if (actrow[j] == default_rule)
484 actrow[j] = 0;
485 }
9ee3c97b 486
ceed8467 487 default_rule = -default_rule;
c3e23647
RS
488 }
489 }
490 }
491
492 /* If have no default rule, the default is an error.
493 So replace any action which says "error" with "use default". */
494
495 if (default_rule == 0)
496 for (j = 0; j < ntokens; j++)
497 {
498 if (actrow[j] == MINSHORT)
499 actrow[j] = 0;
500 }
501
36281465 502 return default_rule;
c3e23647
RS
503}
504
505
4a120d45 506static void
d2729d44 507save_row (int state)
c3e23647 508{
6c89f1c1
AD
509 int i;
510 int count;
511 short *sp;
512 short *sp1;
513 short *sp2;
c3e23647
RS
514
515 count = 0;
516 for (i = 0; i < ntokens; i++)
517 {
518 if (actrow[i] != 0)
519 count++;
520 }
521
522 if (count == 0)
523 return;
524
d7913476
AD
525 froms[state] = sp1 = sp = XCALLOC (short, count);
526 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
527
528 for (i = 0; i < ntokens; i++)
529 {
530 if (actrow[i] != 0)
531 {
532 *sp1++ = i;
533 *sp2++ = actrow[i];
534 }
535 }
536
537 tally[state] = count;
538 width[state] = sp1[-1] - sp[0] + 1;
539}
540
541
6c89f1c1
AD
542/*------------------------------------------------------------------.
543| Figure out the actions for the specified state, indexed by |
544| lookahead token type. |
545| |
f2acea59
AD
546| The YYDEFACT table is output now. The detailed info is saved for |
547| putting into YYTABLE later. |
6c89f1c1 548`------------------------------------------------------------------*/
c3e23647 549
4a120d45 550static void
6c89f1c1 551token_actions (void)
c3e23647 552{
6c89f1c1 553 int i;
d7913476 554 short *yydefact = XCALLOC (short, nstates);
c3e23647 555
d7913476 556 actrow = XCALLOC (short, ntokens);
f2acea59 557 for (i = 0; i < nstates; ++i)
c3e23647 558 {
f2acea59 559 yydefact[i] = action_row (i);
6c89f1c1 560 save_row (i);
c3e23647 561 }
bbb5bcc6 562
342b8b6e 563 output_table_data (&output_obstack, yydefact,
26f609ff 564 yydefact[0], 1, nstates);
11d82f03 565 muscle_insert ("defact", obstack_finish (&output_obstack));
342b8b6e 566
26f609ff 567 XFREE (actrow);
d7913476 568 XFREE (yydefact);
c3e23647
RS
569}
570
571
4a120d45 572static void
d2729d44 573save_column (int symbol, int default_state)
c3e23647 574{
6c89f1c1 575 int i;
6c89f1c1
AD
576 short *sp;
577 short *sp1;
578 short *sp2;
579 int count;
580 int symno;
c3e23647 581
43591cec
AD
582 short begin = goto_map[symbol];
583 short end = goto_map[symbol + 1];
c3e23647
RS
584
585 count = 0;
43591cec 586 for (i = begin; i < end; i++)
c3e23647
RS
587 {
588 if (to_state[i] != default_state)
589 count++;
590 }
591
592 if (count == 0)
593 return;
594
595 symno = symbol - ntokens + nstates;
596
d7913476
AD
597 froms[symno] = sp1 = sp = XCALLOC (short, count);
598 tos[symno] = sp2 = XCALLOC (short, count);
c3e23647 599
43591cec 600 for (i = begin; i < end; i++)
c3e23647
RS
601 {
602 if (to_state[i] != default_state)
603 {
604 *sp1++ = from_state[i];
605 *sp2++ = to_state[i];
606 }
607 }
608
609 tally[symno] = count;
610 width[symno] = sp1[-1] - sp[0] + 1;
611}
612
6c89f1c1
AD
613static int
614default_goto (int symbol)
615{
616 int i;
617 int m;
618 int n;
619 int default_state;
620 int max;
621
622 m = goto_map[symbol];
623 n = goto_map[symbol + 1];
624
625 if (m == n)
626 return -1;
627
628 for (i = 0; i < nstates; i++)
629 state_count[i] = 0;
630
631 for (i = m; i < n; i++)
632 state_count[to_state[i]]++;
633
634 max = 0;
635 default_state = -1;
636
637 for (i = 0; i < nstates; i++)
638 {
639 if (state_count[i] > max)
640 {
641 max = state_count[i];
642 default_state = i;
643 }
644 }
645
646 return default_state;
647}
648
649
650/*-------------------------------------------------------------------.
651| Figure out what to do after reducing with each rule, depending on |
652| the saved state from before the beginning of parsing the data that |
653| matched this rule. |
654| |
655| The YYDEFGOTO table is output now. The detailed info is saved for |
656| putting into YYTABLE later. |
657`-------------------------------------------------------------------*/
658
659static void
660goto_actions (void)
661{
43591cec 662 int i;
bbb5bcc6 663 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 664
26f609ff 665 state_count = XCALLOC (short, nstates);
43591cec 666 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 667 {
43591cec
AD
668 int default_state = default_goto (i);
669 save_column (i, default_state);
670 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
671 }
672
342b8b6e 673 output_table_data (&output_obstack, yydefgoto,
26f609ff 674 yydefgoto[0], 1, nsyms - ntokens);
11d82f03 675 muscle_insert ("defgoto", obstack_finish (&output_obstack));
43591cec 676
d7913476 677 XFREE (state_count);
43591cec 678 XFREE (yydefgoto);
6c89f1c1 679}
c3e23647
RS
680
681
9ee3c97b
AD
682/* The next few functions decide how to pack the actions and gotos
683 information into yytable. */
c3e23647 684
4a120d45 685static void
d2729d44 686sort_actions (void)
c3e23647 687{
6c89f1c1
AD
688 int i;
689 int j;
690 int k;
691 int t;
692 int w;
c3e23647 693
d7913476 694 order = XCALLOC (short, nvectors);
c3e23647
RS
695 nentries = 0;
696
697 for (i = 0; i < nvectors; i++)
698 {
699 if (tally[i] > 0)
700 {
701 t = tally[i];
702 w = width[i];
703 j = nentries - 1;
704
705 while (j >= 0 && (width[order[j]] < w))
706 j--;
707
708 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
709 j--;
710
711 for (k = nentries - 1; k > j; k--)
712 order[k + 1] = order[k];
713
714 order[j + 1] = i;
715 nentries++;
716 }
717 }
718}
719
720
4a120d45 721static int
d2729d44 722matching_state (int vector)
c3e23647 723{
6c89f1c1
AD
724 int i;
725 int j;
726 int k;
727 int t;
728 int w;
729 int match;
730 int prev;
c3e23647
RS
731
732 i = order[vector];
733 if (i >= nstates)
36281465 734 return -1;
c3e23647
RS
735
736 t = tally[i];
737 w = width[i];
738
739 for (prev = vector - 1; prev >= 0; prev--)
740 {
741 j = order[prev];
742 if (width[j] != w || tally[j] != t)
36281465 743 return -1;
c3e23647
RS
744
745 match = 1;
746 for (k = 0; match && k < t; k++)
747 {
748 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
749 match = 0;
750 }
751
752 if (match)
36281465 753 return j;
c3e23647
RS
754 }
755
36281465 756 return -1;
c3e23647
RS
757}
758
759
4a120d45 760static int
d2729d44 761pack_vector (int vector)
c3e23647 762{
6c89f1c1
AD
763 int i;
764 int j;
765 int k;
766 int t;
767 int loc = 0;
768 int ok;
769 short *from;
770 short *to;
c3e23647
RS
771
772 i = order[vector];
773 t = tally[i];
774
340ef489 775 assert (t);
c3e23647
RS
776
777 from = froms[i];
778 to = tos[i];
779
780 for (j = lowzero - from[0]; j < MAXTABLE; j++)
781 {
782 ok = 1;
783
784 for (k = 0; ok && k < t; k++)
785 {
786 loc = j + from[k];
787 if (loc > MAXTABLE)
a0f6b076 788 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
c3e23647
RS
789
790 if (table[loc] != 0)
791 ok = 0;
792 }
793
794 for (k = 0; ok && k < vector; k++)
795 {
796 if (pos[k] == j)
797 ok = 0;
798 }
799
800 if (ok)
801 {
802 for (k = 0; k < t; k++)
803 {
804 loc = j + from[k];
805 table[loc] = to[k];
806 check[loc] = from[k];
807 }
808
809 while (table[lowzero] != 0)
810 lowzero++;
811
812 if (loc > high)
813 high = loc;
814
36281465 815 return j;
c3e23647
RS
816 }
817 }
818
ceed8467
AD
819 berror ("pack_vector");
820 return 0; /* JF keep lint happy */
c3e23647
RS
821}
822
823
6c89f1c1
AD
824static void
825pack_table (void)
826{
827 int i;
828 int place;
829 int state;
830
d7913476
AD
831 base = XCALLOC (short, nvectors);
832 pos = XCALLOC (short, nentries);
833 table = XCALLOC (short, MAXTABLE);
834 check = XCALLOC (short, MAXTABLE);
6c89f1c1
AD
835
836 lowzero = 0;
837 high = 0;
838
839 for (i = 0; i < nvectors; i++)
840 base[i] = MINSHORT;
841
842 for (i = 0; i < MAXTABLE; i++)
843 check[i] = -1;
844
845 for (i = 0; i < nentries; i++)
846 {
847 state = matching_state (i);
848
849 if (state < 0)
850 place = pack_vector (i);
851 else
852 place = base[state];
853
854 pos[i] = place;
855 base[order[i]] = place;
856 }
857
858 for (i = 0; i < nvectors; i++)
859 {
860 if (froms[i])
d7913476 861 XFREE (froms[i]);
6c89f1c1 862 if (tos[i])
d7913476 863 XFREE (tos[i]);
6c89f1c1
AD
864 }
865
d7913476
AD
866 XFREE (froms);
867 XFREE (tos);
868 XFREE (pos);
6c89f1c1 869}
c3e23647
RS
870
871/* the following functions output yytable, yycheck
872 and the vectors whose elements index the portion starts */
873
4a120d45 874static void
d2729d44 875output_base (void)
c3e23647 876{
26f609ff 877 /* Output pact. */
342b8b6e 878 output_table_data (&output_obstack, base,
26f609ff 879 base[0], 1, nstates);
11d82f03 880 muscle_insert ("pact", obstack_finish (&output_obstack));
c3e23647 881
26f609ff 882 /* Output pgoto. */
342b8b6e 883 output_table_data (&output_obstack, base,
26f609ff 884 base[nstates], nstates + 1, nvectors);
11d82f03 885 muscle_insert ("pgoto", obstack_finish (&output_obstack));
c3e23647 886
d7913476 887 XFREE (base);
c3e23647
RS
888}
889
890
4a120d45 891static void
d2729d44 892output_table (void)
c3e23647 893{
342b8b6e 894 output_table_data (&output_obstack, table,
26f609ff 895 table[0], 1, high + 1);
11d82f03 896 muscle_insert ("table", obstack_finish (&output_obstack));
d7913476 897 XFREE (table);
c3e23647
RS
898}
899
900
4a120d45 901static void
d2729d44 902output_check (void)
c3e23647 903{
342b8b6e 904 output_table_data (&output_obstack, check,
26f609ff 905 check[0], 1, high + 1);
11d82f03 906 muscle_insert ("check", obstack_finish (&output_obstack));
d7913476 907 XFREE (check);
c3e23647
RS
908}
909
6c89f1c1
AD
910/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
911 and yycheck. */
912
913static void
914output_actions (void)
915{
916 nvectors = nstates + nvars;
c3e23647 917
d7913476
AD
918 froms = XCALLOC (short *, nvectors);
919 tos = XCALLOC (short *, nvectors);
920 tally = XCALLOC (short, nvectors);
921 width = XCALLOC (short, nvectors);
6c89f1c1
AD
922
923 token_actions ();
300f275f
AD
924 LIST_FREE (shifts, first_shift);
925 LIST_FREE (reductions, first_reduction);
d7913476
AD
926 XFREE (LA);
927 XFREE (LAruleno);
6c89f1c1
AD
928
929 goto_actions ();
d7913476
AD
930 XFREE (goto_map + ntokens);
931 XFREE (from_state);
932 XFREE (to_state);
6c89f1c1
AD
933
934 sort_actions ();
935 pack_table ();
4e5caae2 936
6c89f1c1
AD
937 output_base ();
938 output_table ();
4e5caae2 939
6c89f1c1 940 output_check ();
9703cc49 941 XFREE (state_table);
6c89f1c1 942}
c3e23647 943
652def80
MA
944\f
945/*------------------------------------------------------------.
946| Copy the parser code from SKEL_FILENAME into OOUT obstack. |
947| and do the muscle substitution. |
948`------------------------------------------------------------*/
c3e23647 949
4a120d45 950static void
652def80 951output_parser (const char *skel_filename, struct obstack *oout)
c3e23647 952{
6c89f1c1 953 int c;
ff61dabd 954 FILE *fskel;
ef7ddedd 955 size_t line;
c3e23647 956
652def80 957 fskel = xfopen (skel_filename, "r");
ef7ddedd 958
e8cb70b9 959 /* New output code. */
26f609ff
RA
960 line = 1;
961 c = getc (fskel);
962 while (c != EOF)
c3e23647 963 {
26f609ff 964 if (c != '%')
573c1d9f 965 {
26f609ff
RA
966 if (c == '\n')
967 ++line;
652def80 968 obstack_1grow (oout, c);
26f609ff 969 c = getc (fskel);
bbb5bcc6 970 }
26f609ff 971 else if ((c = getc (fskel)) == '%')
bbb5bcc6 972 {
11d82f03
MA
973 /* Read the muscle. */
974 const char *muscle_key = 0;
975 const char *muscle_value = 0;
652def80 976
5b5d1929 977 while (isalnum (c = getc (fskel)) || c == '-')
11d82f03
MA
978 obstack_1grow (&muscle_obstack, c);
979 obstack_1grow (&muscle_obstack, 0);
26f609ff 980
e8cb70b9 981 /* Output the right value, or see if it's something special. */
11d82f03
MA
982 muscle_key = obstack_finish (&muscle_obstack);
983 muscle_value = muscle_find (muscle_key);
984 if (muscle_value)
652def80 985 obstack_sgrow (oout, muscle_value);
11d82f03 986 else if (!strcmp (muscle_key, "line"))
652def80 987 obstack_fgrow1 (oout, "%d", line + 1);
5b5d1929 988 else if (!strcmp (muscle_key, "input-line"))
577c6c84 989 obstack_fgrow1 (oout, "%d", lineno);
bbb5bcc6 990 else
26f609ff 991 {
652def80
MA
992 obstack_sgrow (oout, "%%");
993 obstack_sgrow (oout, muscle_key);
26f609ff 994 }
573c1d9f 995 }
b0cfa28a 996 else
652def80 997 obstack_1grow (oout, '%');
bbb5bcc6 998 }
26f609ff 999
e8cb70b9 1000 /* End. */
ff61dabd 1001 xfclose (fskel);
c3e23647
RS
1002}
1003
652def80
MA
1004/*----------------------------------------.
1005| Prepare the master parser to be output |
1006`----------------------------------------*/
1007
1008static void
1009output_master_parser (void)
1010{
1011 if (!skeleton)
1012 {
1013 if (semantic_parser)
1014 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
1015 else
1016 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
1017 }
c1ecb3c1 1018 muscle_insert ("skeleton", skeleton);
652def80
MA
1019 output_parser (skeleton, &table_obstack);
1020}
1021
1022
26f609ff
RA
1023/* FIXME. */
1024
11d82f03
MA
1025#define MUSCLE_INSERT_INT(Key, Value) \
1026{ \
1027 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1028 obstack_1grow (&muscle_obstack, 0); \
1029 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1030}
1031
11d82f03
MA
1032#define MUSCLE_INSERT_STRING(Key, Value) \
1033{ \
1034 obstack_sgrow (&muscle_obstack, Value); \
1035 obstack_1grow (&muscle_obstack, 0); \
1036 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1037}
1038
11d82f03 1039#define MUSCLE_INSERT_PREFIX(Key, Value) \
26f609ff 1040{ \
11d82f03
MA
1041 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1042 obstack_1grow (&muscle_obstack, 0); \
1043 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1044}
1045
1046static void
1047prepare (void)
1048{
11d82f03
MA
1049 MUSCLE_INSERT_INT ("last", high);
1050 MUSCLE_INSERT_INT ("flag", MINSHORT);
1051 MUSCLE_INSERT_INT ("pure", pure_parser);
1052 MUSCLE_INSERT_INT ("nsym", nsyms);
1053 MUSCLE_INSERT_INT ("debug", debug_flag);
1054 MUSCLE_INSERT_INT ("final", final_state);
1055 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1056 MUSCLE_INSERT_INT ("ntbase", ntokens);
c7925b99 1057 MUSCLE_INSERT_INT ("error-verbose", error_verbose);
11d82f03
MA
1058
1059 MUSCLE_INSERT_INT ("nnts", nvars);
1060 MUSCLE_INSERT_INT ("nrules", nrules);
1061 MUSCLE_INSERT_INT ("nstates", nstates);
1062 MUSCLE_INSERT_INT ("ntokens", ntokens);
1063
5b5d1929 1064 MUSCLE_INSERT_INT ("locations-flag", locations_flag);
9e644e64 1065
1c8c2190
PB
1066 /* We need to save the actions in the muscle %%action. */
1067 muscle_insert ("action", obstack_finish (&action_obstack));
1068
26f609ff 1069 if (spec_name_prefix)
11d82f03 1070 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
26f609ff 1071}
c3e23647 1072
6c89f1c1
AD
1073/*----------------------------------------------------------.
1074| Output the parsing tables and the parser code to ftable. |
1075`----------------------------------------------------------*/
c3e23647 1076
6c89f1c1
AD
1077void
1078output (void)
1079{
26f609ff 1080 obstack_init (&output_obstack);
dd60faec 1081
300f275f 1082 LIST_FREE (core, first_state);
26f609ff 1083
6c89f1c1 1084 output_token_translations ();
6c89f1c1 1085 output_gram ();
26f609ff 1086
d7913476 1087 XFREE (ritem);
6c89f1c1
AD
1088 if (semantic_parser)
1089 output_stos ();
1090 output_rule_data ();
0846f581 1091 XFREE (user_toknums);
6c89f1c1 1092 output_actions ();
342b8b6e 1093
d8cb5183
MA
1094#if 0
1095 if (!no_parser_flag) */
1096#endif
26f609ff 1097 prepare ();
d1a2daf7 1098 /* Copy definitions in directive. */
11d82f03 1099 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
652def80
MA
1100
1101 output_master_parser ();
26f609ff 1102
11d82f03 1103 obstack_free (&muscle_obstack, 0);
26f609ff 1104 obstack_free (&output_obstack, 0);
1c8c2190 1105 obstack_free (&action_obstack, 0);
c3e23647 1106}