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