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