]> git.saurik.com Git - bison.git/blob - src/output.c
* src/bison.simple (_yy_memcpy): CPP reformat.
[bison.git] / src / output.c
1 /* Output the generated parsing program for bison,
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of Bison, the GNU Compiler Compiler.
5
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.
10
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.
15
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. */
20
21
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.
25
26 yytranslate = vector mapping yylex's token numbers into bison's token
27 numbers.
28
29 ** yytname = vector of string-names indexed by bison token number
30
31 ** yytoknum = vector of yylex token numbers corresponding to entries
32 in yytname
33
34 yyrline = vector of line-numbers of all rules. For yydebug printouts.
35
36 yyrhs = vector of items of all rules.
37 This is exactly what ritems contains. For yydebug and for semantic
38 parser.
39
40 yyprhs[r] = index in yyrhs of first item for rule r.
41
42 yyr1[r] = symbol number of symbol that rule r derives.
43
44 yyr2[r] = number of symbols composing right hand side of rule r.
45
46 * yystos[s] = the symbol number of the symbol that leads to state s.
47
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.
51
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.
55
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.
59
60 If the value in yytable is positive,
61 we shift the token and go to that state.
62
63 If the value is negative, it is minus a rule number to reduce by.
64
65 If the value is zero, the default action from yydefact[s] is used.
66
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.
73
74 yytable = a vector filled with portions for different uses,
75 found via yypact and yypgoto.
76
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.
80
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.
87
88 YYFINAL = the state number of the termination state.
89 YYFLAG = most negative short int. Used to flag ??
90 YYNTBASE = ntokens.
91 */
92
93 #include "system.h"
94 #include "obstack.h"
95 #include "quotearg.h"
96 #include "getargs.h"
97 #include "xalloc.h"
98 #include "files.h"
99 #include "gram.h"
100 #include "LR0.h"
101 #include "complain.h"
102 #include "output.h"
103 #include "lalr.h"
104 #include "reader.h"
105 #include "conflicts.h"
106
107 extern void berror PARAMS((const char *));
108
109
110
111 static int nvectors;
112 static int nentries;
113 static short **froms;
114 static short **tos;
115 static short *tally;
116 static short *width;
117 static short *actrow;
118 static short *state_count;
119 static short *order;
120 static short *base;
121 static short *pos;
122 static short *table;
123 static short *check;
124 static int lowzero;
125 static int high;
126
127
128
129 static inline void
130 output_short_or_char_table (struct obstack *oout,
131 const char *comment,
132 const char *type,
133 const char *table_name,
134 short *short_table,
135 short first_value,
136 short begin, short end)
137 {
138 int i, j;
139
140 if (comment)
141 obstack_fgrow1 (oout, "/* %s. */\n", comment);
142
143 obstack_fgrow3 (oout, "static const %s %s[] =\n{\n %6d",
144 type, table_name, first_value);
145
146 j = 1;
147 for (i = begin; i < end; i++)
148 {
149 obstack_1grow (oout, ',');
150
151 if (j >= 10)
152 {
153 obstack_sgrow (oout, "\n ");
154 j = 1;
155 }
156 else
157 {
158 j++;
159 }
160
161 obstack_fgrow1 (oout, "%6d", short_table[i]);
162 }
163
164 obstack_sgrow (oout, "\n};\n");
165 }
166
167
168 static inline void
169 output_short_table (struct obstack *oout,
170 const char *comment,
171 const char *table_name,
172 short *short_table,
173 short first_value,
174 short begin, short end)
175 {
176 output_short_or_char_table (oout, comment, "short", table_name, short_table,
177 first_value, begin, end);
178 }
179
180
181 /*--------------------------------------------------------------.
182 | output_headers -- Output constant strings to the beginning of |
183 | certain files. |
184 `--------------------------------------------------------------*/
185
186 /* Don't put the `%s' insides quotes, since it quotearg puts them. */
187
188 #define GUARDSTR \
189 "\n\
190 #include %s\n\
191 extern int yyerror;\n\
192 extern int yycost;\n\
193 extern char * yymsg;\n\
194 extern YYSTYPE yyval;\n\
195 \n\
196 yyguard(n, yyvsp, yylsp)\n\
197 register int n;\n\
198 register YYSTYPE *yyvsp;\n\
199 register YYLTYPE *yylsp;\n\
200 {\n\
201 yyerror = 0;\n\
202 yycost = 0;\n\
203 yymsg = 0;\n\
204 switch (n)\n\
205 {"
206
207 #define ACTSTR \
208 "\n\
209 #include %s\n\
210 extern YYSTYPE yyval;\n\
211 extern int yychar;\n\
212 \n\
213 yyaction(n, yyvsp, yylsp)\n\
214 register int n;\n\
215 register YYSTYPE *yyvsp;\n\
216 register YYLTYPE *yylsp;\n\
217 {\n\
218 switch (n)\n\
219 {"
220
221 #define ACTSTR_SIMPLE "\n switch (yyn) {\n"
222
223 void
224 output_headers (void)
225 {
226 char *attrsfile_quoted = 0;
227
228 if (semantic_parser)
229 {
230 /* FIXME: This is *buggy*. ATTRSFILE is not computed yet, since
231 we are waiting for the full input file to have been read to
232 be sure of the output file name. So basically, here, a SEGV
233 is guaranteed. OTOH, currently semantic parsers are not
234 supported. */
235 attrsfile_quoted = quotearg_style (c_quoting_style, attrsfile);
236 obstack_fgrow1 (&guard_obstack, GUARDSTR, attrsfile_quoted);
237 }
238
239 if (no_parser_flag)
240 return;
241
242 if (semantic_parser)
243 obstack_fgrow1 (&action_obstack, ACTSTR, attrsfile_quoted);
244 else
245 obstack_sgrow (&action_obstack, ACTSTR_SIMPLE);
246
247 /* Rename certain symbols if -p was specified. */
248 if (spec_name_prefix)
249 {
250 obstack_fgrow1 (&table_obstack,
251 "#define yyparse %sparse\n", spec_name_prefix);
252 obstack_fgrow1 (&table_obstack,
253 "#define yylex %slex\n", spec_name_prefix);
254 obstack_fgrow1 (&table_obstack,
255 "#define yyerror %serror\n", spec_name_prefix);
256 obstack_fgrow1 (&table_obstack,
257 "#define yylval %slval\n", spec_name_prefix);
258 obstack_fgrow1 (&table_obstack,
259 "#define yychar %schar\n", spec_name_prefix);
260 obstack_fgrow1 (&table_obstack,
261 "#define yydebug %sdebug\n", spec_name_prefix);
262 obstack_fgrow1 (&table_obstack,
263 "#define yynerrs %snerrs\n", spec_name_prefix);
264 }
265 }
266
267
268 /*-------------------------------------------------------.
269 | Output constant strings to the ends of certain files. |
270 `-------------------------------------------------------*/
271
272 void
273 output_trailers (void)
274 {
275 if (semantic_parser)
276 obstack_sgrow (&guard_obstack, "\n }\n}\n");
277
278 obstack_1grow (&action_obstack, '\n');
279
280 if (no_parser_flag)
281 return;
282
283 if (semantic_parser)
284 obstack_sgrow (&action_obstack, " }\n");
285
286 obstack_sgrow (&action_obstack, "}\n");
287 }
288
289
290
291 static void
292 output_token_translations (void)
293 {
294 obstack_sgrow (&table_obstack, "\
295 \n\
296 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n");
297
298 if (translations)
299 {
300 obstack_fgrow2 (&table_obstack,
301 "#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\
302 \n\
303 \n",
304 max_user_token_number, nsyms);
305
306 output_short_or_char_table (&table_obstack,
307 "YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX",
308 ntokens < 127 ? "char" : "short",
309 "yytranslate", token_translations,
310 0, 1, max_user_token_number + 1);
311 }
312 else
313 {
314 obstack_sgrow (&table_obstack,
315 "\n#define YYTRANSLATE(x) (x)\n");
316 }
317 }
318
319
320 static void
321 output_gram (void)
322 {
323 /* With the ordinary parser,
324 yyprhs and yyrhs are needed only for yydebug. */
325 /* With the no_parser option, all tables are generated */
326 if (!semantic_parser && !no_parser_flag)
327 obstack_sgrow (&table_obstack, "\n#if YYDEBUG != 0\n");
328
329 output_short_table (&table_obstack, NULL, "yyprhs", rrhs,
330 0, 1, nrules + 1);
331
332 {
333 size_t yyrhs_size = 1;
334 short *yyrhs, *sp;
335 int i;
336
337 for (sp = ritem + 1; *sp; sp++)
338 ++yyrhs_size;
339 yyrhs = XMALLOC (short, yyrhs_size);
340
341 for (sp = ritem + 1, i = 1; *sp; ++sp, ++i)
342 yyrhs[i] = *sp > 0 ? *sp : 0;
343
344 output_short_table (&table_obstack, NULL, "yyrhs", yyrhs,
345 ritem[0], 1, yyrhs_size);
346 XFREE (yyrhs);
347 }
348
349 if (!semantic_parser && !no_parser_flag)
350 obstack_sgrow (&table_obstack, "\n#endif\n");
351 }
352
353
354 static void
355 output_stos (void)
356 {
357 output_short_table (&table_obstack, NULL, "yystos", accessing_symbol,
358 0, 1, nstates);
359 }
360
361
362 static void
363 output_rule_data (void)
364 {
365 int i;
366 int j;
367 short *short_tab = NULL;
368
369 obstack_sgrow (&table_obstack, "\n\
370 #if YYDEBUG != 0\n");
371
372 output_short_table (&table_obstack,
373 "YYRLINE[YYN] -- source line where rule number YYN was defined",
374 "yyrline", rline,
375 0, 1, nrules + 1);
376
377 obstack_sgrow (&table_obstack, "#endif\n\n");
378
379 if (token_table_flag || no_parser_flag)
380 {
381 obstack_fgrow1 (&table_obstack, "#define YYNTOKENS %d\n", ntokens);
382 obstack_fgrow1 (&table_obstack, "#define YYNNTS %d\n", nvars);
383 obstack_fgrow1 (&table_obstack, "#define YYNRULES %d\n", nrules);
384 obstack_fgrow1 (&table_obstack, "#define YYNSTATES %d\n", nstates);
385 obstack_fgrow1 (&table_obstack, "#define YYMAXUTOK %d\n\n",
386 max_user_token_number);
387 }
388
389 /* Output the table of symbol names. */
390 if (!token_table_flag && !no_parser_flag)
391 obstack_sgrow (&table_obstack,
392 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
393 obstack_sgrow (&table_obstack, "\
394 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
395 obstack_sgrow (&table_obstack,
396 "static const char *const yytname[] =\n{\n ");
397
398 j = 0;
399 for (i = 0; i < nsyms; i++)
400 /* this used to be i<=nsyms, but that output a final "" symbol
401 almost by accident */
402 {
403 /* Width of the next token, including the two quotes, the coma
404 and the space. */
405 int strsize = 4;
406 char *p;
407
408 for (p = tags[i]; p && *p; p++)
409 if (*p == '"' || *p == '\\' || *p == '\n' || *p == '\t'
410 || *p == '\b')
411 strsize += 2;
412 else if (*p < 040 || *p >= 0177)
413 strsize += 4;
414 else
415 strsize++;
416
417 if (j + strsize > 75)
418 {
419 obstack_sgrow (&table_obstack, "\n ");
420 j = 2;
421 }
422
423 obstack_1grow (&table_obstack, '\"');
424 for (p = tags[i]; p && *p; p++)
425 {
426 if (*p == '"' || *p == '\\')
427 obstack_fgrow1 (&table_obstack, "\\%c", *p);
428 else if (*p == '\n')
429 obstack_sgrow (&table_obstack, "\\n");
430 else if (*p == '\t')
431 obstack_sgrow (&table_obstack, "\\t");
432 else if (*p == '\b')
433 obstack_sgrow (&table_obstack, "\\b");
434 else if (*p < 040 || *p >= 0177)
435 obstack_fgrow1 (&table_obstack, "\\%03o", *p);
436 else
437 obstack_1grow (&table_obstack, *p);
438 }
439
440 obstack_sgrow (&table_obstack, "\", ");
441 j += strsize;
442 }
443 /* add a NULL entry to list of tokens */
444 obstack_sgrow (&table_obstack, "NULL\n};\n");
445
446 if (!token_table_flag && !no_parser_flag)
447 obstack_sgrow (&table_obstack, "#endif\n\n");
448
449 /* Output YYTOKNUM. */
450 if (token_table_flag)
451 {
452 output_short_table (&table_obstack,
453 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
454 "yytoknum", user_toknums,
455 0, 1, ntokens + 1);
456 }
457
458 /* Output YYR1. */
459 output_short_table (&table_obstack,
460 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
461 "yyr1", rlhs,
462 0, 1, nrules + 1);
463 XFREE (rlhs + 1);
464
465 obstack_1grow (&table_obstack, '\n');
466
467 /* Output YYR2. */
468 short_tab = XMALLOC (short, nrules + 1);
469 for (i = 1; i < nrules; i++)
470 short_tab[i] = rrhs[i + 1] - rrhs[i] - 1;
471 short_tab[nrules] = nitems - rrhs[nrules] - 1;
472 output_short_table (&table_obstack,
473 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
474 "yyr2", short_tab,
475 0, 1, nrules + 1);
476 obstack_1grow (&table_obstack, '\n');
477
478 XFREE (short_tab);
479
480 XFREE (rrhs + 1);
481 }
482
483
484 static void
485 output_defines (void)
486 {
487 obstack_fgrow1 (&table_obstack, "\n\n#define\tYYFINAL\t\t%d\n", final_state);
488 obstack_fgrow1 (&table_obstack, "#define\tYYFLAG\t\t%d\n", MINSHORT);
489 obstack_fgrow1 (&table_obstack, "#define\tYYNTBASE\t%d\n", ntokens);
490 }
491
492
493 /*------------------------------------------------------------------.
494 | Decide what to do for each type of token if seen as the lookahead |
495 | token in specified state. The value returned is used as the |
496 | default action (yydefact) for the state. In addition, actrow is |
497 | filled with what to do for each kind of token, index by symbol |
498 | number, with zero meaning do the default action. The value |
499 | MINSHORT, a very negative number, means this situation is an |
500 | error. The parser recognizes this value specially. |
501 | |
502 | This is where conflicts are resolved. The loop over lookahead |
503 | rules considered lower-numbered rules last, and the last rule |
504 | considered that likes a token gets to handle it. |
505 `------------------------------------------------------------------*/
506
507 static int
508 action_row (int state)
509 {
510 int i;
511 int j;
512 int k;
513 int m = 0;
514 int n = 0;
515 int count;
516 int default_rule;
517 int nreds;
518 int max;
519 int rule;
520 int shift_state;
521 int symbol;
522 unsigned mask;
523 unsigned *wordp;
524 reductions *redp;
525 shifts *shiftp;
526 errs *errp;
527 int nodefault = 0; /* set nonzero to inhibit having any default reduction */
528
529 for (i = 0; i < ntokens; i++)
530 actrow[i] = 0;
531
532 default_rule = 0;
533 nreds = 0;
534 redp = reduction_table[state];
535
536 if (redp)
537 {
538 nreds = redp->nreds;
539
540 if (nreds >= 1)
541 {
542 /* loop over all the rules available here which require
543 lookahead */
544 m = lookaheads[state];
545 n = lookaheads[state + 1];
546
547 for (i = n - 1; i >= m; i--)
548 {
549 rule = -LAruleno[i];
550 wordp = LA + i * tokensetsize;
551 mask = 1;
552
553 /* and find each token which the rule finds acceptable
554 to come next */
555 for (j = 0; j < ntokens; j++)
556 {
557 /* and record this rule as the rule to use if that
558 token follows. */
559 if (mask & *wordp)
560 actrow[j] = rule;
561
562 mask <<= 1;
563 if (mask == 0)
564 {
565 mask = 1;
566 wordp++;
567 }
568 }
569 }
570 }
571 }
572
573 shiftp = shift_table[state];
574
575 /* Now see which tokens are allowed for shifts in this state. For
576 them, record the shift as the thing to do. So shift is preferred
577 to reduce. */
578
579 if (shiftp)
580 {
581 k = shiftp->nshifts;
582
583 for (i = 0; i < k; i++)
584 {
585 shift_state = shiftp->shifts[i];
586 if (!shift_state)
587 continue;
588
589 symbol = accessing_symbol[shift_state];
590
591 if (ISVAR (symbol))
592 break;
593
594 actrow[symbol] = shift_state;
595
596 /* Do not use any default reduction if there is a shift for
597 error */
598 if (symbol == error_token_number)
599 nodefault = 1;
600 }
601 }
602
603 errp = err_table[state];
604
605 /* See which tokens are an explicit error in this state (due to
606 %nonassoc). For them, record MINSHORT as the action. */
607
608 if (errp)
609 {
610 k = errp->nerrs;
611
612 for (i = 0; i < k; i++)
613 {
614 symbol = errp->errs[i];
615 actrow[symbol] = MINSHORT;
616 }
617 }
618
619 /* Now find the most common reduction and make it the default action
620 for this state. */
621
622 if (nreds >= 1 && !nodefault)
623 {
624 if (consistent[state])
625 default_rule = redp->rules[0];
626 else
627 {
628 max = 0;
629 for (i = m; i < n; i++)
630 {
631 count = 0;
632 rule = -LAruleno[i];
633
634 for (j = 0; j < ntokens; j++)
635 {
636 if (actrow[j] == rule)
637 count++;
638 }
639
640 if (count > max)
641 {
642 max = count;
643 default_rule = rule;
644 }
645 }
646
647 /* actions which match the default are replaced with zero,
648 which means "use the default" */
649
650 if (max > 0)
651 {
652 for (j = 0; j < ntokens; j++)
653 {
654 if (actrow[j] == default_rule)
655 actrow[j] = 0;
656 }
657
658 default_rule = -default_rule;
659 }
660 }
661 }
662
663 /* If have no default rule, the default is an error.
664 So replace any action which says "error" with "use default". */
665
666 if (default_rule == 0)
667 for (j = 0; j < ntokens; j++)
668 {
669 if (actrow[j] == MINSHORT)
670 actrow[j] = 0;
671 }
672
673 return default_rule;
674 }
675
676
677 static void
678 save_row (int state)
679 {
680 int i;
681 int count;
682 short *sp;
683 short *sp1;
684 short *sp2;
685
686 count = 0;
687 for (i = 0; i < ntokens; i++)
688 {
689 if (actrow[i] != 0)
690 count++;
691 }
692
693 if (count == 0)
694 return;
695
696 froms[state] = sp1 = sp = XCALLOC (short, count);
697 tos[state] = sp2 = XCALLOC (short, count);
698
699 for (i = 0; i < ntokens; i++)
700 {
701 if (actrow[i] != 0)
702 {
703 *sp1++ = i;
704 *sp2++ = actrow[i];
705 }
706 }
707
708 tally[state] = count;
709 width[state] = sp1[-1] - sp[0] + 1;
710 }
711
712
713 /*------------------------------------------------------------------.
714 | Figure out the actions for the specified state, indexed by |
715 | lookahead token type. |
716 | |
717 | The YYDEFACT table is output now. The detailed info is saved for |
718 | putting into YYTABLE later. |
719 `------------------------------------------------------------------*/
720
721 static void
722 token_actions (void)
723 {
724 int i;
725 short *yydefact = XCALLOC (short, nstates);
726
727 actrow = XCALLOC (short, ntokens);
728 for (i = 0; i < nstates; ++i)
729 {
730 yydefact[i] = action_row (i);
731 save_row (i);
732 }
733 XFREE (actrow);
734
735 output_short_table (&table_obstack,
736 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
737 doesn't specify something else to do. Zero means the default is an\n\
738 error",
739 "yydefact", yydefact,
740 yydefact[0], 1, nstates);
741 obstack_1grow (&table_obstack, '\n');
742 XFREE (yydefact);
743 }
744
745
746 static void
747 free_shifts (void)
748 {
749 shifts *sp, *sptmp; /* JF derefrenced freed ptr */
750
751 XFREE (shift_table);
752
753 for (sp = first_shift; sp; sp = sptmp)
754 {
755 sptmp = sp->next;
756 XFREE (sp);
757 }
758 }
759
760
761 static void
762 free_reductions (void)
763 {
764 reductions *rp, *rptmp; /* JF fixed freed ptr */
765
766 XFREE (reduction_table);
767
768 for (rp = first_reduction; rp; rp = rptmp)
769 {
770 rptmp = rp->next;
771 XFREE (rp);
772 }
773 }
774
775
776
777 static void
778 save_column (int symbol, int default_state)
779 {
780 int i;
781 short *sp;
782 short *sp1;
783 short *sp2;
784 int count;
785 int symno;
786
787 short begin = goto_map[symbol];
788 short end = goto_map[symbol + 1];
789
790 count = 0;
791 for (i = begin; i < end; i++)
792 {
793 if (to_state[i] != default_state)
794 count++;
795 }
796
797 if (count == 0)
798 return;
799
800 symno = symbol - ntokens + nstates;
801
802 froms[symno] = sp1 = sp = XCALLOC (short, count);
803 tos[symno] = sp2 = XCALLOC (short, count);
804
805 for (i = begin; i < end; i++)
806 {
807 if (to_state[i] != default_state)
808 {
809 *sp1++ = from_state[i];
810 *sp2++ = to_state[i];
811 }
812 }
813
814 tally[symno] = count;
815 width[symno] = sp1[-1] - sp[0] + 1;
816 }
817
818 static int
819 default_goto (int symbol)
820 {
821 int i;
822 int m;
823 int n;
824 int default_state;
825 int max;
826
827 m = goto_map[symbol];
828 n = goto_map[symbol + 1];
829
830 if (m == n)
831 return -1;
832
833 for (i = 0; i < nstates; i++)
834 state_count[i] = 0;
835
836 for (i = m; i < n; i++)
837 state_count[to_state[i]]++;
838
839 max = 0;
840 default_state = -1;
841
842 for (i = 0; i < nstates; i++)
843 {
844 if (state_count[i] > max)
845 {
846 max = state_count[i];
847 default_state = i;
848 }
849 }
850
851 return default_state;
852 }
853
854
855 /*-------------------------------------------------------------------.
856 | Figure out what to do after reducing with each rule, depending on |
857 | the saved state from before the beginning of parsing the data that |
858 | matched this rule. |
859 | |
860 | The YYDEFGOTO table is output now. The detailed info is saved for |
861 | putting into YYTABLE later. |
862 `-------------------------------------------------------------------*/
863
864 static void
865 goto_actions (void)
866 {
867 int i;
868
869 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
870 state_count = XCALLOC (short, nstates);
871
872 for (i = ntokens; i < nsyms; ++i)
873 {
874 int default_state = default_goto (i);
875 save_column (i, default_state);
876 yydefgoto[i - ntokens] = default_state;
877 }
878
879 output_short_table (&table_obstack, NULL, "yydefgoto", yydefgoto,
880 yydefgoto[0], 1, nsyms - ntokens);
881
882 XFREE (state_count);
883 XFREE (yydefgoto);
884 }
885
886
887 /* The next few functions decide how to pack the actions and gotos
888 information into yytable. */
889
890 static void
891 sort_actions (void)
892 {
893 int i;
894 int j;
895 int k;
896 int t;
897 int w;
898
899 order = XCALLOC (short, nvectors);
900 nentries = 0;
901
902 for (i = 0; i < nvectors; i++)
903 {
904 if (tally[i] > 0)
905 {
906 t = tally[i];
907 w = width[i];
908 j = nentries - 1;
909
910 while (j >= 0 && (width[order[j]] < w))
911 j--;
912
913 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
914 j--;
915
916 for (k = nentries - 1; k > j; k--)
917 order[k + 1] = order[k];
918
919 order[j + 1] = i;
920 nentries++;
921 }
922 }
923 }
924
925
926 static int
927 matching_state (int vector)
928 {
929 int i;
930 int j;
931 int k;
932 int t;
933 int w;
934 int match;
935 int prev;
936
937 i = order[vector];
938 if (i >= nstates)
939 return -1;
940
941 t = tally[i];
942 w = width[i];
943
944 for (prev = vector - 1; prev >= 0; prev--)
945 {
946 j = order[prev];
947 if (width[j] != w || tally[j] != t)
948 return -1;
949
950 match = 1;
951 for (k = 0; match && k < t; k++)
952 {
953 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
954 match = 0;
955 }
956
957 if (match)
958 return j;
959 }
960
961 return -1;
962 }
963
964
965 static int
966 pack_vector (int vector)
967 {
968 int i;
969 int j;
970 int k;
971 int t;
972 int loc = 0;
973 int ok;
974 short *from;
975 short *to;
976
977 i = order[vector];
978 t = tally[i];
979
980 assert (t);
981
982 from = froms[i];
983 to = tos[i];
984
985 for (j = lowzero - from[0]; j < MAXTABLE; j++)
986 {
987 ok = 1;
988
989 for (k = 0; ok && k < t; k++)
990 {
991 loc = j + from[k];
992 if (loc > MAXTABLE)
993 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
994
995 if (table[loc] != 0)
996 ok = 0;
997 }
998
999 for (k = 0; ok && k < vector; k++)
1000 {
1001 if (pos[k] == j)
1002 ok = 0;
1003 }
1004
1005 if (ok)
1006 {
1007 for (k = 0; k < t; k++)
1008 {
1009 loc = j + from[k];
1010 table[loc] = to[k];
1011 check[loc] = from[k];
1012 }
1013
1014 while (table[lowzero] != 0)
1015 lowzero++;
1016
1017 if (loc > high)
1018 high = loc;
1019
1020 return j;
1021 }
1022 }
1023
1024 berror ("pack_vector");
1025 return 0; /* JF keep lint happy */
1026 }
1027
1028
1029 static void
1030 pack_table (void)
1031 {
1032 int i;
1033 int place;
1034 int state;
1035
1036 base = XCALLOC (short, nvectors);
1037 pos = XCALLOC (short, nentries);
1038 table = XCALLOC (short, MAXTABLE);
1039 check = XCALLOC (short, MAXTABLE);
1040
1041 lowzero = 0;
1042 high = 0;
1043
1044 for (i = 0; i < nvectors; i++)
1045 base[i] = MINSHORT;
1046
1047 for (i = 0; i < MAXTABLE; i++)
1048 check[i] = -1;
1049
1050 for (i = 0; i < nentries; i++)
1051 {
1052 state = matching_state (i);
1053
1054 if (state < 0)
1055 place = pack_vector (i);
1056 else
1057 place = base[state];
1058
1059 pos[i] = place;
1060 base[order[i]] = place;
1061 }
1062
1063 for (i = 0; i < nvectors; i++)
1064 {
1065 if (froms[i])
1066 XFREE (froms[i]);
1067 if (tos[i])
1068 XFREE (tos[i]);
1069 }
1070
1071 XFREE (froms);
1072 XFREE (tos);
1073 XFREE (pos);
1074 }
1075
1076 /* the following functions output yytable, yycheck
1077 and the vectors whose elements index the portion starts */
1078
1079 static void
1080 output_base (void)
1081 {
1082 output_short_table (&table_obstack, NULL, "yypact", base,
1083 base[0], 1, nstates);
1084
1085 obstack_1grow (&table_obstack, '\n');
1086
1087 output_short_table (&table_obstack, NULL, "yypgoto", base,
1088 base[nstates], nstates + 1, nvectors);
1089
1090 XFREE (base);
1091 }
1092
1093
1094 static void
1095 output_table (void)
1096 {
1097 obstack_fgrow1 (&table_obstack, "\n\n#define\tYYLAST\t\t%d\n\n\n", high);
1098 output_short_table (&table_obstack, NULL, "yytable", table,
1099 table[0], 1, high + 1);
1100 XFREE (table);
1101 }
1102
1103
1104 static void
1105 output_check (void)
1106 {
1107 output_short_table (&table_obstack, NULL, "yycheck", check,
1108 check[0], 1, high + 1);
1109 XFREE (check);
1110 }
1111
1112 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1113 and yycheck. */
1114
1115 static void
1116 output_actions (void)
1117 {
1118 nvectors = nstates + nvars;
1119
1120 froms = XCALLOC (short *, nvectors);
1121 tos = XCALLOC (short *, nvectors);
1122 tally = XCALLOC (short, nvectors);
1123 width = XCALLOC (short, nvectors);
1124
1125 token_actions ();
1126 free_shifts ();
1127 free_reductions ();
1128 XFREE (lookaheads);
1129 XFREE (LA);
1130 XFREE (LAruleno);
1131 XFREE (accessing_symbol);
1132
1133 goto_actions ();
1134 XFREE (goto_map + ntokens);
1135 XFREE (from_state);
1136 XFREE (to_state);
1137
1138 sort_actions ();
1139 pack_table ();
1140 obstack_1grow (&table_obstack, '\n');
1141 output_base ();
1142 output_table ();
1143 obstack_1grow (&table_obstack, '\n');
1144 output_check ();
1145 }
1146
1147 /*------------------------------------------.
1148 | Copy the parser code into TABLE_OBSTACK. |
1149 `------------------------------------------*/
1150
1151 static void
1152 output_parser (void)
1153 {
1154 int c;
1155 FILE *fskel;
1156 size_t line;
1157 int actions_dumped = 0;
1158
1159 if (pure_parser)
1160 obstack_sgrow (&table_obstack, "#define YYPURE 1\n\n");
1161
1162 /* Loop over lines in the standard parser file. */
1163 if (!skeleton)
1164 {
1165 if (semantic_parser)
1166 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
1167 else
1168 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
1169 }
1170 fskel = xfopen (skeleton, "r");
1171
1172 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1173 decimal integer constant. This specifies that the line number of
1174 the *following* line of input, in its original source file, was
1175 LINENUM. */
1176 line = 2;
1177
1178 while (1)
1179 {
1180 enum line_type_e
1181 {
1182 regular_line,
1183 sync_line, /* #line. */
1184 actions_line /* %% actions. */
1185 };
1186 enum line_type_e line_type = regular_line;
1187
1188 c = getc (fskel);
1189
1190 /* Is this line special? */
1191 if (c == '#')
1192 {
1193 /* See if it's a `#line' line. */
1194 if ((c = getc (fskel)) == 'l')
1195 if ((c = getc (fskel)) == 'i')
1196 if ((c = getc (fskel)) == 'n')
1197 if ((c = getc (fskel)) == 'e')
1198 line_type = sync_line;
1199 else
1200 obstack_sgrow (&table_obstack, "#lin");
1201 else
1202 obstack_sgrow (&table_obstack, "#li");
1203 else
1204 obstack_sgrow (&table_obstack, "#l");
1205 else
1206 obstack_sgrow (&table_obstack, "#");
1207 }
1208 else if (c == '%')
1209 {
1210 /* See if it's a `%% actions' line. */
1211 if ((c = getc (fskel)) == '%')
1212 if ((c = getc (fskel)) == ' ')
1213 if ((c = getc (fskel)) == 'a')
1214 if ((c = getc (fskel)) == 'c')
1215 if ((c = getc (fskel)) == 't')
1216 if ((c = getc (fskel)) == 'i')
1217 if ((c = getc (fskel)) == 'o')
1218 if ((c = getc (fskel)) == 'n')
1219 if ((c = getc (fskel)) == 's')
1220 line_type = actions_line;
1221 else
1222 obstack_sgrow (&table_obstack, "%% action");
1223 else
1224 obstack_sgrow (&table_obstack, "%% actio");
1225 else
1226 obstack_sgrow (&table_obstack, "%% acti");
1227 else
1228 obstack_sgrow (&table_obstack, "%% act");
1229 else
1230 obstack_sgrow (&table_obstack, "%% ac");
1231 else
1232 obstack_sgrow (&table_obstack, "%% a");
1233 else
1234 obstack_sgrow (&table_obstack, "%% ");
1235 else
1236 obstack_sgrow (&table_obstack, "%%");
1237 else
1238 obstack_sgrow (&table_obstack, "%");
1239 }
1240
1241 switch (line_type)
1242 {
1243 case sync_line:
1244 if (!no_lines_flag)
1245 obstack_fgrow2 (&table_obstack, "#line %d %s\n",
1246 line, quotearg_style (c_quoting_style, skeleton));
1247
1248 /* Skip the end of line. */
1249 for (; c != '\n' && c != EOF; c = getc (fskel))
1250 /* nothing */;
1251 break;
1252
1253 case actions_line:
1254 {
1255 size_t size = obstack_object_size (&action_obstack);
1256
1257 actions_dumped++;
1258 assert (actions_dumped == 1);
1259 obstack_grow (&table_obstack,
1260 obstack_finish (&action_obstack),
1261 size);
1262 }
1263
1264 /* Skip the end of line. */
1265 for (; c != '\n' && c != EOF; c = getc (fskel))
1266 /* nothing */;
1267 break;
1268
1269 case regular_line:
1270 for (; c != '\n' && c != EOF; c = getc (fskel))
1271 obstack_1grow (&table_obstack, c);
1272 }
1273
1274 if (c == EOF)
1275 break;
1276 obstack_1grow (&table_obstack, c);
1277 line++;
1278 }
1279 assert (actions_dumped == 1);
1280 xfclose (fskel);
1281 }
1282
1283 static void
1284 output_program (void)
1285 {
1286 int c;
1287
1288 if (!no_lines_flag)
1289 obstack_fgrow2 (&table_obstack, "#line %d %s\n",
1290 lineno, quotearg_style (c_quoting_style, infile));
1291
1292 while ((c = getc (finput)) != EOF)
1293 obstack_1grow (&table_obstack, c);
1294 }
1295
1296
1297 static void
1298 free_itemsets (void)
1299 {
1300 core *cp, *cptmp;
1301
1302 XFREE (state_table);
1303
1304 for (cp = first_state; cp; cp = cptmp)
1305 {
1306 cptmp = cp->next;
1307 XFREE (cp);
1308 }
1309 }
1310
1311
1312 /*----------------------------------------------------------.
1313 | Output the parsing tables and the parser code to ftable. |
1314 `----------------------------------------------------------*/
1315
1316 void
1317 output (void)
1318 {
1319 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1320
1321 /* If using a simple parser the definition of YYSTYPE are put into
1322 TABLE_OBSTACK. */
1323 if (!semantic_parser)
1324 {
1325 size_t size = obstack_object_size (&attrs_obstack);
1326 obstack_grow (&table_obstack, obstack_finish (&attrs_obstack), size);
1327 }
1328 reader_output_yylsp (&table_obstack);
1329 if (debug_flag)
1330 obstack_sgrow (&table_obstack, "\
1331 #ifndef YYDEBUG\n\
1332 # define YYDEBUG 1\n\
1333 #endif\n\
1334 \n");
1335
1336 if (semantic_parser)
1337 obstack_fgrow1 (&table_obstack, "#include %s\n",
1338 quotearg_style (c_quoting_style, attrsfile));
1339
1340 if (!no_parser_flag)
1341 obstack_sgrow (&table_obstack, "#include <stdio.h>\n\n");
1342
1343 /* Make "const" do nothing if not in ANSI C. */
1344 obstack_sgrow (&table_obstack, "\
1345 #ifndef __cplusplus\n\
1346 # ifndef __STDC__\n\
1347 # define const\n\
1348 # endif\n\
1349 #endif\n\
1350 \n");
1351
1352 free_itemsets ();
1353 output_defines ();
1354 output_token_translations ();
1355 /* if (semantic_parser) */
1356 /* This is now unconditional because debugging printouts can use it. */
1357 output_gram ();
1358 XFREE (ritem);
1359 if (semantic_parser)
1360 output_stos ();
1361 output_rule_data ();
1362 output_actions ();
1363 if (!no_parser_flag)
1364 output_parser ();
1365 output_program ();
1366 }