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