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