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