]> git.saurik.com Git - bison.git/blame - src/output.c
Add src/state.c to the repo.
[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
36281465
AD
402 /* Now see which tokens are allowed for shifts in this state. For
403 them, record the shift as the thing to do. So shift is preferred
404 to reduce. */
d954473d 405 shiftp = state_table[state].shift_table;
c3e23647 406
d954473d 407 for (i = 0; i < shiftp->nshifts; i++)
c3e23647 408 {
d954473d
AD
409 shift_state = shiftp->shifts[i];
410 if (!shift_state)
411 continue;
c3e23647 412
d954473d 413 symbol = state_table[shift_state].accessing_symbol;
c3e23647 414
d954473d
AD
415 if (ISVAR (symbol))
416 break;
c3e23647 417
d954473d 418 actrow[symbol] = shift_state;
c3e23647 419
d954473d
AD
420 /* Do not use any default reduction if there is a shift for
421 error */
422 if (symbol == error_token_number)
423 nodefault = 1;
c3e23647
RS
424 }
425
36281465
AD
426 /* See which tokens are an explicit error in this state (due to
427 %nonassoc). For them, record MINSHORT as the action. */
d954473d 428 errp = err_table[state];
c3e23647
RS
429
430 if (errp)
431 {
432 k = errp->nerrs;
433
434 for (i = 0; i < k; i++)
435 {
436 symbol = errp->errs[i];
437 actrow[symbol] = MINSHORT;
438 }
439 }
440
36281465
AD
441 /* Now find the most common reduction and make it the default action
442 for this state. */
c3e23647 443
ceed8467 444 if (nreds >= 1 && !nodefault)
c3e23647 445 {
de326cc0 446 if (state_table[state].consistent)
c3e23647
RS
447 default_rule = redp->rules[0];
448 else
449 {
450 max = 0;
451 for (i = m; i < n; i++)
452 {
453 count = 0;
ceed8467 454 rule = -LAruleno[i];
9ee3c97b 455
c3e23647
RS
456 for (j = 0; j < ntokens; j++)
457 {
458 if (actrow[j] == rule)
459 count++;
460 }
9ee3c97b 461
c3e23647
RS
462 if (count > max)
463 {
464 max = count;
465 default_rule = rule;
466 }
467 }
9ee3c97b 468
c3e23647
RS
469 /* actions which match the default are replaced with zero,
470 which means "use the default" */
9ee3c97b 471
c3e23647
RS
472 if (max > 0)
473 {
474 for (j = 0; j < ntokens; j++)
475 {
476 if (actrow[j] == default_rule)
477 actrow[j] = 0;
478 }
9ee3c97b 479
ceed8467 480 default_rule = -default_rule;
c3e23647
RS
481 }
482 }
483 }
484
485 /* If have no default rule, the default is an error.
486 So replace any action which says "error" with "use default". */
487
488 if (default_rule == 0)
489 for (j = 0; j < ntokens; j++)
490 {
491 if (actrow[j] == MINSHORT)
492 actrow[j] = 0;
493 }
494
36281465 495 return default_rule;
c3e23647
RS
496}
497
498
4a120d45 499static void
d2729d44 500save_row (int state)
c3e23647 501{
6c89f1c1
AD
502 int i;
503 int count;
504 short *sp;
505 short *sp1;
506 short *sp2;
c3e23647
RS
507
508 count = 0;
509 for (i = 0; i < ntokens; i++)
510 {
511 if (actrow[i] != 0)
512 count++;
513 }
514
515 if (count == 0)
516 return;
517
d7913476
AD
518 froms[state] = sp1 = sp = XCALLOC (short, count);
519 tos[state] = sp2 = XCALLOC (short, count);
c3e23647
RS
520
521 for (i = 0; i < ntokens; i++)
522 {
523 if (actrow[i] != 0)
524 {
525 *sp1++ = i;
526 *sp2++ = actrow[i];
527 }
528 }
529
530 tally[state] = count;
531 width[state] = sp1[-1] - sp[0] + 1;
532}
533
534
6c89f1c1
AD
535/*------------------------------------------------------------------.
536| Figure out the actions for the specified state, indexed by |
537| lookahead token type. |
538| |
f2acea59
AD
539| The YYDEFACT table is output now. The detailed info is saved for |
540| putting into YYTABLE later. |
6c89f1c1 541`------------------------------------------------------------------*/
c3e23647 542
4a120d45 543static void
6c89f1c1 544token_actions (void)
c3e23647 545{
6c89f1c1 546 int i;
d7913476 547 short *yydefact = XCALLOC (short, nstates);
c3e23647 548
d7913476 549 actrow = XCALLOC (short, ntokens);
f2acea59 550 for (i = 0; i < nstates; ++i)
c3e23647 551 {
f2acea59 552 yydefact[i] = action_row (i);
6c89f1c1 553 save_row (i);
c3e23647 554 }
bbb5bcc6 555
342b8b6e 556 output_table_data (&output_obstack, yydefact,
26f609ff 557 yydefact[0], 1, nstates);
11d82f03 558 muscle_insert ("defact", obstack_finish (&output_obstack));
342b8b6e 559
26f609ff 560 XFREE (actrow);
d7913476 561 XFREE (yydefact);
c3e23647
RS
562}
563
564
4a120d45 565static void
d2729d44 566save_column (int symbol, int default_state)
c3e23647 567{
6c89f1c1 568 int i;
6c89f1c1
AD
569 short *sp;
570 short *sp1;
571 short *sp2;
572 int count;
573 int symno;
c3e23647 574
43591cec
AD
575 short begin = goto_map[symbol];
576 short end = goto_map[symbol + 1];
c3e23647
RS
577
578 count = 0;
43591cec 579 for (i = begin; i < end; i++)
c3e23647
RS
580 {
581 if (to_state[i] != default_state)
582 count++;
583 }
584
585 if (count == 0)
586 return;
587
588 symno = symbol - ntokens + nstates;
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++)
c3e23647
RS
594 {
595 if (to_state[i] != default_state)
596 {
597 *sp1++ = from_state[i];
598 *sp2++ = to_state[i];
599 }
600 }
601
602 tally[symno] = count;
603 width[symno] = sp1[-1] - sp[0] + 1;
604}
605
6c89f1c1
AD
606static int
607default_goto (int symbol)
608{
609 int i;
610 int m;
611 int n;
612 int default_state;
613 int max;
614
615 m = goto_map[symbol];
616 n = goto_map[symbol + 1];
617
618 if (m == n)
619 return -1;
620
621 for (i = 0; i < nstates; i++)
622 state_count[i] = 0;
623
624 for (i = m; i < n; i++)
625 state_count[to_state[i]]++;
626
627 max = 0;
628 default_state = -1;
629
630 for (i = 0; i < nstates; i++)
631 {
632 if (state_count[i] > max)
633 {
634 max = state_count[i];
635 default_state = i;
636 }
637 }
638
639 return default_state;
640}
641
642
643/*-------------------------------------------------------------------.
644| Figure out what to do after reducing with each rule, depending on |
645| the saved state from before the beginning of parsing the data that |
646| matched this rule. |
647| |
648| The YYDEFGOTO table is output now. The detailed info is saved for |
649| putting into YYTABLE later. |
650`-------------------------------------------------------------------*/
651
652static void
653goto_actions (void)
654{
43591cec 655 int i;
bbb5bcc6 656 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
bbb5bcc6 657
26f609ff 658 state_count = XCALLOC (short, nstates);
43591cec 659 for (i = ntokens; i < nsyms; ++i)
6c89f1c1 660 {
43591cec
AD
661 int default_state = default_goto (i);
662 save_column (i, default_state);
663 yydefgoto[i - ntokens] = default_state;
6c89f1c1
AD
664 }
665
342b8b6e 666 output_table_data (&output_obstack, yydefgoto,
26f609ff 667 yydefgoto[0], 1, nsyms - ntokens);
11d82f03 668 muscle_insert ("defgoto", obstack_finish (&output_obstack));
43591cec 669
d7913476 670 XFREE (state_count);
43591cec 671 XFREE (yydefgoto);
6c89f1c1 672}
c3e23647
RS
673
674
9ee3c97b
AD
675/* The next few functions decide how to pack the actions and gotos
676 information into yytable. */
c3e23647 677
4a120d45 678static void
d2729d44 679sort_actions (void)
c3e23647 680{
6c89f1c1
AD
681 int i;
682 int j;
683 int k;
684 int t;
685 int w;
c3e23647 686
d7913476 687 order = XCALLOC (short, nvectors);
c3e23647
RS
688 nentries = 0;
689
690 for (i = 0; i < nvectors; i++)
691 {
692 if (tally[i] > 0)
693 {
694 t = tally[i];
695 w = width[i];
696 j = nentries - 1;
697
698 while (j >= 0 && (width[order[j]] < w))
699 j--;
700
701 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
702 j--;
703
704 for (k = nentries - 1; k > j; k--)
705 order[k + 1] = order[k];
706
707 order[j + 1] = i;
708 nentries++;
709 }
710 }
711}
712
713
4a120d45 714static int
d2729d44 715matching_state (int vector)
c3e23647 716{
6c89f1c1
AD
717 int i;
718 int j;
719 int k;
720 int t;
721 int w;
722 int match;
723 int prev;
c3e23647
RS
724
725 i = order[vector];
726 if (i >= nstates)
36281465 727 return -1;
c3e23647
RS
728
729 t = tally[i];
730 w = width[i];
731
732 for (prev = vector - 1; prev >= 0; prev--)
733 {
734 j = order[prev];
735 if (width[j] != w || tally[j] != t)
36281465 736 return -1;
c3e23647
RS
737
738 match = 1;
739 for (k = 0; match && k < t; k++)
740 {
741 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
742 match = 0;
743 }
744
745 if (match)
36281465 746 return j;
c3e23647
RS
747 }
748
36281465 749 return -1;
c3e23647
RS
750}
751
752
4a120d45 753static int
d2729d44 754pack_vector (int vector)
c3e23647 755{
6c89f1c1
AD
756 int i;
757 int j;
758 int k;
759 int t;
760 int loc = 0;
761 int ok;
762 short *from;
763 short *to;
c3e23647
RS
764
765 i = order[vector];
766 t = tally[i];
767
340ef489 768 assert (t);
c3e23647
RS
769
770 from = froms[i];
771 to = tos[i];
772
773 for (j = lowzero - from[0]; j < MAXTABLE; j++)
774 {
775 ok = 1;
776
777 for (k = 0; ok && k < t; k++)
778 {
779 loc = j + from[k];
780 if (loc > MAXTABLE)
a0f6b076 781 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
c3e23647
RS
782
783 if (table[loc] != 0)
784 ok = 0;
785 }
786
787 for (k = 0; ok && k < vector; k++)
788 {
789 if (pos[k] == j)
790 ok = 0;
791 }
792
793 if (ok)
794 {
795 for (k = 0; k < t; k++)
796 {
797 loc = j + from[k];
798 table[loc] = to[k];
799 check[loc] = from[k];
800 }
801
802 while (table[lowzero] != 0)
803 lowzero++;
804
805 if (loc > high)
806 high = loc;
807
36281465 808 return j;
c3e23647
RS
809 }
810 }
811
ceed8467
AD
812 berror ("pack_vector");
813 return 0; /* JF keep lint happy */
c3e23647
RS
814}
815
816
6c89f1c1
AD
817static void
818pack_table (void)
819{
820 int i;
821 int place;
822 int state;
823
d7913476
AD
824 base = XCALLOC (short, nvectors);
825 pos = XCALLOC (short, nentries);
826 table = XCALLOC (short, MAXTABLE);
827 check = XCALLOC (short, MAXTABLE);
6c89f1c1
AD
828
829 lowzero = 0;
830 high = 0;
831
832 for (i = 0; i < nvectors; i++)
833 base[i] = MINSHORT;
834
835 for (i = 0; i < MAXTABLE; i++)
836 check[i] = -1;
837
838 for (i = 0; i < nentries; i++)
839 {
840 state = matching_state (i);
841
842 if (state < 0)
843 place = pack_vector (i);
844 else
845 place = base[state];
846
847 pos[i] = place;
848 base[order[i]] = place;
849 }
850
851 for (i = 0; i < nvectors; i++)
852 {
853 if (froms[i])
d7913476 854 XFREE (froms[i]);
6c89f1c1 855 if (tos[i])
d7913476 856 XFREE (tos[i]);
6c89f1c1
AD
857 }
858
d7913476
AD
859 XFREE (froms);
860 XFREE (tos);
861 XFREE (pos);
6c89f1c1 862}
c3e23647
RS
863
864/* the following functions output yytable, yycheck
865 and the vectors whose elements index the portion starts */
866
4a120d45 867static void
d2729d44 868output_base (void)
c3e23647 869{
26f609ff 870 /* Output pact. */
342b8b6e 871 output_table_data (&output_obstack, base,
26f609ff 872 base[0], 1, nstates);
11d82f03 873 muscle_insert ("pact", obstack_finish (&output_obstack));
c3e23647 874
26f609ff 875 /* Output pgoto. */
342b8b6e 876 output_table_data (&output_obstack, base,
26f609ff 877 base[nstates], nstates + 1, nvectors);
11d82f03 878 muscle_insert ("pgoto", obstack_finish (&output_obstack));
c3e23647 879
d7913476 880 XFREE (base);
c3e23647
RS
881}
882
883
4a120d45 884static void
d2729d44 885output_table (void)
c3e23647 886{
342b8b6e 887 output_table_data (&output_obstack, table,
26f609ff 888 table[0], 1, high + 1);
11d82f03 889 muscle_insert ("table", obstack_finish (&output_obstack));
d7913476 890 XFREE (table);
c3e23647
RS
891}
892
893
4a120d45 894static void
d2729d44 895output_check (void)
c3e23647 896{
342b8b6e 897 output_table_data (&output_obstack, check,
26f609ff 898 check[0], 1, high + 1);
11d82f03 899 muscle_insert ("check", obstack_finish (&output_obstack));
d7913476 900 XFREE (check);
c3e23647
RS
901}
902
6c89f1c1
AD
903/* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
904 and yycheck. */
905
906static void
907output_actions (void)
908{
909 nvectors = nstates + nvars;
c3e23647 910
d7913476
AD
911 froms = XCALLOC (short *, nvectors);
912 tos = XCALLOC (short *, nvectors);
913 tally = XCALLOC (short, nvectors);
914 width = XCALLOC (short, nvectors);
6c89f1c1
AD
915
916 token_actions ();
300f275f
AD
917 LIST_FREE (shifts, first_shift);
918 LIST_FREE (reductions, first_reduction);
d7913476
AD
919 XFREE (LA);
920 XFREE (LAruleno);
6c89f1c1
AD
921
922 goto_actions ();
d7913476
AD
923 XFREE (goto_map + ntokens);
924 XFREE (from_state);
925 XFREE (to_state);
6c89f1c1
AD
926
927 sort_actions ();
928 pack_table ();
4e5caae2 929
6c89f1c1
AD
930 output_base ();
931 output_table ();
4e5caae2 932
6c89f1c1 933 output_check ();
9703cc49 934 XFREE (state_table);
6c89f1c1 935}
c3e23647 936
652def80
MA
937\f
938/*------------------------------------------------------------.
939| Copy the parser code from SKEL_FILENAME into OOUT obstack. |
940| and do the muscle substitution. |
941`------------------------------------------------------------*/
c3e23647 942
4a120d45 943static void
652def80 944output_parser (const char *skel_filename, struct obstack *oout)
c3e23647 945{
6c89f1c1 946 int c;
ff61dabd 947 FILE *fskel;
ef7ddedd 948 size_t line;
c3e23647 949
652def80 950 fskel = xfopen (skel_filename, "r");
ef7ddedd 951
e8cb70b9 952 /* New output code. */
26f609ff
RA
953 line = 1;
954 c = getc (fskel);
955 while (c != EOF)
c3e23647 956 {
26f609ff 957 if (c != '%')
573c1d9f 958 {
26f609ff
RA
959 if (c == '\n')
960 ++line;
652def80 961 obstack_1grow (oout, c);
26f609ff 962 c = getc (fskel);
bbb5bcc6 963 }
26f609ff 964 else if ((c = getc (fskel)) == '%')
bbb5bcc6 965 {
11d82f03
MA
966 /* Read the muscle. */
967 const char *muscle_key = 0;
968 const char *muscle_value = 0;
652def80 969
5b5d1929 970 while (isalnum (c = getc (fskel)) || c == '-')
11d82f03
MA
971 obstack_1grow (&muscle_obstack, c);
972 obstack_1grow (&muscle_obstack, 0);
26f609ff 973
e8cb70b9 974 /* Output the right value, or see if it's something special. */
11d82f03
MA
975 muscle_key = obstack_finish (&muscle_obstack);
976 muscle_value = muscle_find (muscle_key);
977 if (muscle_value)
652def80 978 obstack_sgrow (oout, muscle_value);
11d82f03 979 else if (!strcmp (muscle_key, "line"))
652def80 980 obstack_fgrow1 (oout, "%d", line + 1);
5b5d1929 981 else if (!strcmp (muscle_key, "input-line"))
577c6c84 982 obstack_fgrow1 (oout, "%d", lineno);
bbb5bcc6 983 else
26f609ff 984 {
652def80
MA
985 obstack_sgrow (oout, "%%");
986 obstack_sgrow (oout, muscle_key);
26f609ff 987 }
573c1d9f 988 }
b0cfa28a 989 else
652def80 990 obstack_1grow (oout, '%');
bbb5bcc6 991 }
26f609ff 992
e8cb70b9 993 /* End. */
ff61dabd 994 xfclose (fskel);
c3e23647
RS
995}
996
652def80
MA
997/*----------------------------------------.
998| Prepare the master parser to be output |
999`----------------------------------------*/
1000
1001static void
1002output_master_parser (void)
1003{
1004 if (!skeleton)
1005 {
1006 if (semantic_parser)
1007 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
1008 else
1009 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
1010 }
c1ecb3c1 1011 muscle_insert ("skeleton", skeleton);
652def80
MA
1012 output_parser (skeleton, &table_obstack);
1013}
1014
1015
26f609ff
RA
1016/* FIXME. */
1017
11d82f03
MA
1018#define MUSCLE_INSERT_INT(Key, Value) \
1019{ \
1020 obstack_fgrow1 (&muscle_obstack, "%d", Value); \
1021 obstack_1grow (&muscle_obstack, 0); \
1022 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1023}
1024
11d82f03
MA
1025#define MUSCLE_INSERT_STRING(Key, Value) \
1026{ \
1027 obstack_sgrow (&muscle_obstack, Value); \
1028 obstack_1grow (&muscle_obstack, 0); \
1029 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1030}
1031
11d82f03 1032#define MUSCLE_INSERT_PREFIX(Key, Value) \
26f609ff 1033{ \
11d82f03
MA
1034 obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \
1035 obstack_1grow (&muscle_obstack, 0); \
1036 muscle_insert (Key, obstack_finish (&muscle_obstack)); \
26f609ff
RA
1037}
1038
1039static void
1040prepare (void)
1041{
11d82f03
MA
1042 MUSCLE_INSERT_INT ("last", high);
1043 MUSCLE_INSERT_INT ("flag", MINSHORT);
1044 MUSCLE_INSERT_INT ("pure", pure_parser);
1045 MUSCLE_INSERT_INT ("nsym", nsyms);
1046 MUSCLE_INSERT_INT ("debug", debug_flag);
1047 MUSCLE_INSERT_INT ("final", final_state);
1048 MUSCLE_INSERT_INT ("maxtok", max_user_token_number);
1049 MUSCLE_INSERT_INT ("ntbase", ntokens);
c7925b99 1050 MUSCLE_INSERT_INT ("error-verbose", error_verbose);
11d82f03
MA
1051
1052 MUSCLE_INSERT_INT ("nnts", nvars);
1053 MUSCLE_INSERT_INT ("nrules", nrules);
1054 MUSCLE_INSERT_INT ("nstates", nstates);
1055 MUSCLE_INSERT_INT ("ntokens", ntokens);
1056
5b5d1929 1057 MUSCLE_INSERT_INT ("locations-flag", locations_flag);
9e644e64 1058
1c8c2190
PB
1059 /* We need to save the actions in the muscle %%action. */
1060 muscle_insert ("action", obstack_finish (&action_obstack));
1061
26f609ff 1062 if (spec_name_prefix)
11d82f03 1063 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
26f609ff 1064}
c3e23647 1065
6c89f1c1
AD
1066/*----------------------------------------------------------.
1067| Output the parsing tables and the parser code to ftable. |
1068`----------------------------------------------------------*/
c3e23647 1069
6c89f1c1
AD
1070void
1071output (void)
1072{
26f609ff 1073 obstack_init (&output_obstack);
dd60faec 1074
300f275f 1075 LIST_FREE (core, first_state);
26f609ff 1076
6c89f1c1 1077 output_token_translations ();
6c89f1c1 1078 output_gram ();
26f609ff 1079
d7913476 1080 XFREE (ritem);
6c89f1c1
AD
1081 if (semantic_parser)
1082 output_stos ();
1083 output_rule_data ();
0846f581 1084 XFREE (user_toknums);
6c89f1c1 1085 output_actions ();
342b8b6e 1086
d8cb5183
MA
1087#if 0
1088 if (!no_parser_flag) */
1089#endif
26f609ff 1090 prepare ();
d1a2daf7 1091 /* Copy definitions in directive. */
11d82f03 1092 muscle_insert ("prologue", obstack_finish (&attrs_obstack));
652def80
MA
1093
1094 output_master_parser ();
26f609ff 1095
11d82f03 1096 obstack_free (&muscle_obstack, 0);
26f609ff 1097 obstack_free (&output_obstack, 0);
1c8c2190 1098 obstack_free (&action_obstack, 0);
c3e23647 1099}