]> git.saurik.com Git - bison.git/blob - src/output.c
* src/warshall.c (TC, RTC): De-obsfucate (source reduced to 22% of
[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 default_rule;
533 int nreds;
534 int rule;
535 int shift_state;
536 int symbol;
537 reductions *redp;
538 shifts *shiftp;
539 errs *errp;
540 int nodefault = 0; /* set nonzero to inhibit having any default reduction */
541
542 for (i = 0; i < ntokens; i++)
543 actrow[i] = 0;
544
545 default_rule = 0;
546 nreds = 0;
547 redp = state_table[state].reduction_table;
548
549 if (redp)
550 {
551 nreds = redp->nreds;
552
553 if (nreds >= 1)
554 {
555 /* loop over all the rules available here which require
556 lookahead */
557 m = state_table[state].lookaheads;
558 n = state_table[state + 1].lookaheads;
559
560 for (i = n - 1; i >= m; i--)
561 /* and find each token which the rule finds acceptable
562 to come next */
563 for (j = 0; j < ntokens; j++)
564 /* and record this rule as the rule to use if that
565 token follows. */
566 if (BITISSET (LA (i), j))
567 actrow[j] = -LAruleno[i];
568 }
569 }
570
571 /* Now see which tokens are allowed for shifts in this state. For
572 them, record the shift as the thing to do. So shift is preferred
573 to reduce. */
574 shiftp = state_table[state].shift_table;
575 for (i = 0; i < shiftp->nshifts; i++)
576 {
577 shift_state = shiftp->shifts[i];
578 if (!shift_state)
579 continue;
580
581 symbol = state_table[shift_state].accessing_symbol;
582
583 if (ISVAR (symbol))
584 break;
585
586 actrow[symbol] = shift_state;
587
588 /* Do not use any default reduction if there is a shift for
589 error */
590 if (symbol == error_token_number)
591 nodefault = 1;
592 }
593
594 /* See which tokens are an explicit error in this state (due to
595 %nonassoc). For them, record MINSHORT as the action. */
596 errp = err_table[state];
597
598 if (errp)
599 {
600 k = errp->nerrs;
601
602 for (i = 0; i < k; i++)
603 {
604 symbol = errp->errs[i];
605 actrow[symbol] = MINSHORT;
606 }
607 }
608
609 /* Now find the most common reduction and make it the default action
610 for this state. */
611
612 if (nreds >= 1 && !nodefault)
613 {
614 if (state_table[state].consistent)
615 default_rule = redp->rules[0];
616 else
617 {
618 int max = 0;
619 for (i = m; i < n; i++)
620 {
621 int count = 0;
622 rule = -LAruleno[i];
623
624 for (j = 0; j < ntokens; j++)
625 {
626 if (actrow[j] == rule)
627 count++;
628 }
629
630 if (count > max)
631 {
632 max = count;
633 default_rule = rule;
634 }
635 }
636
637 /* actions which match the default are replaced with zero,
638 which means "use the default" */
639
640 if (max > 0)
641 {
642 for (j = 0; j < ntokens; j++)
643 {
644 if (actrow[j] == default_rule)
645 actrow[j] = 0;
646 }
647
648 default_rule = -default_rule;
649 }
650 }
651 }
652
653 /* If have no default rule, the default is an error.
654 So replace any action which says "error" with "use default". */
655
656 if (default_rule == 0)
657 for (j = 0; j < ntokens; j++)
658 {
659 if (actrow[j] == MINSHORT)
660 actrow[j] = 0;
661 }
662
663 return default_rule;
664 }
665
666
667 static void
668 save_row (int state)
669 {
670 int i;
671 int count;
672 short *sp;
673 short *sp1;
674 short *sp2;
675
676 count = 0;
677 for (i = 0; i < ntokens; i++)
678 {
679 if (actrow[i] != 0)
680 count++;
681 }
682
683 if (count == 0)
684 return;
685
686 froms[state] = sp1 = sp = XCALLOC (short, count);
687 tos[state] = sp2 = XCALLOC (short, count);
688
689 for (i = 0; i < ntokens; i++)
690 {
691 if (actrow[i] != 0)
692 {
693 *sp1++ = i;
694 *sp2++ = actrow[i];
695 }
696 }
697
698 tally[state] = count;
699 width[state] = sp1[-1] - sp[0] + 1;
700 }
701
702
703 /*------------------------------------------------------------------.
704 | Figure out the actions for the specified state, indexed by |
705 | lookahead token type. |
706 | |
707 | The YYDEFACT table is output now. The detailed info is saved for |
708 | putting into YYTABLE later. |
709 `------------------------------------------------------------------*/
710
711 static void
712 token_actions (void)
713 {
714 int i;
715 short *yydefact = XCALLOC (short, nstates);
716
717 actrow = XCALLOC (short, ntokens);
718 for (i = 0; i < nstates; ++i)
719 {
720 yydefact[i] = action_row (i);
721 save_row (i);
722 }
723 XFREE (actrow);
724
725 output_short_table (&table_obstack,
726 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
727 doesn't specify something else to do. Zero means the default is an\n\
728 error",
729 "yydefact", yydefact,
730 yydefact[0], 1, nstates);
731 obstack_1grow (&table_obstack, '\n');
732 XFREE (yydefact);
733 }
734
735
736 static void
737 save_column (int symbol, int default_state)
738 {
739 int i;
740 short *sp;
741 short *sp1;
742 short *sp2;
743 int count;
744 int symno;
745
746 short begin = goto_map[symbol];
747 short end = goto_map[symbol + 1];
748
749 count = 0;
750 for (i = begin; i < end; i++)
751 {
752 if (to_state[i] != default_state)
753 count++;
754 }
755
756 if (count == 0)
757 return;
758
759 symno = symbol - ntokens + nstates;
760
761 froms[symno] = sp1 = sp = XCALLOC (short, count);
762 tos[symno] = sp2 = XCALLOC (short, count);
763
764 for (i = begin; i < end; i++)
765 {
766 if (to_state[i] != default_state)
767 {
768 *sp1++ = from_state[i];
769 *sp2++ = to_state[i];
770 }
771 }
772
773 tally[symno] = count;
774 width[symno] = sp1[-1] - sp[0] + 1;
775 }
776
777 static int
778 default_goto (int symbol)
779 {
780 int i;
781 int m;
782 int n;
783 int default_state;
784 int max;
785
786 m = goto_map[symbol];
787 n = goto_map[symbol + 1];
788
789 if (m == n)
790 return -1;
791
792 for (i = 0; i < nstates; i++)
793 state_count[i] = 0;
794
795 for (i = m; i < n; i++)
796 state_count[to_state[i]]++;
797
798 max = 0;
799 default_state = -1;
800
801 for (i = 0; i < nstates; i++)
802 {
803 if (state_count[i] > max)
804 {
805 max = state_count[i];
806 default_state = i;
807 }
808 }
809
810 return default_state;
811 }
812
813
814 /*-------------------------------------------------------------------.
815 | Figure out what to do after reducing with each rule, depending on |
816 | the saved state from before the beginning of parsing the data that |
817 | matched this rule. |
818 | |
819 | The YYDEFGOTO table is output now. The detailed info is saved for |
820 | putting into YYTABLE later. |
821 `-------------------------------------------------------------------*/
822
823 static void
824 goto_actions (void)
825 {
826 int i;
827
828 short *yydefgoto = XMALLOC (short, nsyms - ntokens);
829 state_count = XCALLOC (short, nstates);
830
831 for (i = ntokens; i < nsyms; ++i)
832 {
833 int default_state = default_goto (i);
834 save_column (i, default_state);
835 yydefgoto[i - ntokens] = default_state;
836 }
837
838 output_short_table (&table_obstack, NULL, "yydefgoto", yydefgoto,
839 yydefgoto[0], 1, nsyms - ntokens);
840
841 XFREE (state_count);
842 XFREE (yydefgoto);
843 }
844
845
846 /* The next few functions decide how to pack the actions and gotos
847 information into yytable. */
848
849 static void
850 sort_actions (void)
851 {
852 int i;
853 int j;
854 int k;
855 int t;
856 int w;
857
858 order = XCALLOC (short, nvectors);
859 nentries = 0;
860
861 for (i = 0; i < nvectors; i++)
862 {
863 if (tally[i] > 0)
864 {
865 t = tally[i];
866 w = width[i];
867 j = nentries - 1;
868
869 while (j >= 0 && (width[order[j]] < w))
870 j--;
871
872 while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
873 j--;
874
875 for (k = nentries - 1; k > j; k--)
876 order[k + 1] = order[k];
877
878 order[j + 1] = i;
879 nentries++;
880 }
881 }
882 }
883
884
885 static int
886 matching_state (int vector)
887 {
888 int i;
889 int j;
890 int k;
891 int t;
892 int w;
893 int match;
894 int prev;
895
896 i = order[vector];
897 if (i >= nstates)
898 return -1;
899
900 t = tally[i];
901 w = width[i];
902
903 for (prev = vector - 1; prev >= 0; prev--)
904 {
905 j = order[prev];
906 if (width[j] != w || tally[j] != t)
907 return -1;
908
909 match = 1;
910 for (k = 0; match && k < t; k++)
911 {
912 if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
913 match = 0;
914 }
915
916 if (match)
917 return j;
918 }
919
920 return -1;
921 }
922
923
924 static int
925 pack_vector (int vector)
926 {
927 int i;
928 int j;
929 int k;
930 int t;
931 int loc = 0;
932 int ok;
933 short *from;
934 short *to;
935
936 i = order[vector];
937 t = tally[i];
938
939 assert (t);
940
941 from = froms[i];
942 to = tos[i];
943
944 for (j = lowzero - from[0]; j < MAXTABLE; j++)
945 {
946 ok = 1;
947
948 for (k = 0; ok && k < t; k++)
949 {
950 loc = j + from[k];
951 if (loc > MAXTABLE)
952 fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
953
954 if (table[loc] != 0)
955 ok = 0;
956 }
957
958 for (k = 0; ok && k < vector; k++)
959 {
960 if (pos[k] == j)
961 ok = 0;
962 }
963
964 if (ok)
965 {
966 for (k = 0; k < t; k++)
967 {
968 loc = j + from[k];
969 table[loc] = to[k];
970 check[loc] = from[k];
971 }
972
973 while (table[lowzero] != 0)
974 lowzero++;
975
976 if (loc > high)
977 high = loc;
978
979 return j;
980 }
981 }
982
983 berror ("pack_vector");
984 return 0; /* JF keep lint happy */
985 }
986
987
988 static void
989 pack_table (void)
990 {
991 int i;
992 int place;
993 int state;
994
995 base = XCALLOC (short, nvectors);
996 pos = XCALLOC (short, nentries);
997 table = XCALLOC (short, MAXTABLE);
998 check = XCALLOC (short, MAXTABLE);
999
1000 lowzero = 0;
1001 high = 0;
1002
1003 for (i = 0; i < nvectors; i++)
1004 base[i] = MINSHORT;
1005
1006 for (i = 0; i < MAXTABLE; i++)
1007 check[i] = -1;
1008
1009 for (i = 0; i < nentries; i++)
1010 {
1011 state = matching_state (i);
1012
1013 if (state < 0)
1014 place = pack_vector (i);
1015 else
1016 place = base[state];
1017
1018 pos[i] = place;
1019 base[order[i]] = place;
1020 }
1021
1022 for (i = 0; i < nvectors; i++)
1023 {
1024 if (froms[i])
1025 XFREE (froms[i]);
1026 if (tos[i])
1027 XFREE (tos[i]);
1028 }
1029
1030 XFREE (froms);
1031 XFREE (tos);
1032 XFREE (pos);
1033 }
1034
1035 /* the following functions output yytable, yycheck
1036 and the vectors whose elements index the portion starts */
1037
1038 static void
1039 output_base (void)
1040 {
1041 output_short_table (&table_obstack, NULL, "yypact", base,
1042 base[0], 1, nstates);
1043
1044 obstack_1grow (&table_obstack, '\n');
1045
1046 output_short_table (&table_obstack, NULL, "yypgoto", base,
1047 base[nstates], nstates + 1, nvectors);
1048
1049 XFREE (base);
1050 }
1051
1052
1053 static void
1054 output_table (void)
1055 {
1056 obstack_fgrow1 (&table_obstack, "\n\n#define\tYYLAST\t\t%d\n\n\n", high);
1057 output_short_table (&table_obstack, NULL, "yytable", table,
1058 table[0], 1, high + 1);
1059 XFREE (table);
1060 }
1061
1062
1063 static void
1064 output_check (void)
1065 {
1066 output_short_table (&table_obstack, NULL, "yycheck", check,
1067 check[0], 1, high + 1);
1068 XFREE (check);
1069 }
1070
1071 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1072 and yycheck. */
1073
1074 static void
1075 output_actions (void)
1076 {
1077 nvectors = nstates + nvars;
1078
1079 froms = XCALLOC (short *, nvectors);
1080 tos = XCALLOC (short *, nvectors);
1081 tally = XCALLOC (short, nvectors);
1082 width = XCALLOC (short, nvectors);
1083
1084 token_actions ();
1085 LIST_FREE (shifts, first_shift);
1086 LIST_FREE (reductions, first_reduction);
1087 XFREE (LA);
1088 XFREE (LAruleno);
1089
1090 goto_actions ();
1091 XFREE (goto_map + ntokens);
1092 XFREE (from_state);
1093 XFREE (to_state);
1094
1095 sort_actions ();
1096 pack_table ();
1097 obstack_1grow (&table_obstack, '\n');
1098 output_base ();
1099 output_table ();
1100 obstack_1grow (&table_obstack, '\n');
1101 output_check ();
1102 }
1103
1104 /*------------------------------------------.
1105 | Copy the parser code into TABLE_OBSTACK. |
1106 `------------------------------------------*/
1107
1108 static void
1109 output_parser (void)
1110 {
1111 int c;
1112 FILE *fskel;
1113 size_t line;
1114 int actions_dumped = 0;
1115
1116 if (pure_parser)
1117 obstack_sgrow (&table_obstack, "#define YYPURE 1\n\n");
1118
1119 /* Loop over lines in the standard parser file. */
1120 if (!skeleton)
1121 {
1122 if (semantic_parser)
1123 skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY);
1124 else
1125 skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE);
1126 }
1127 assert (skeleton);
1128 fskel = xfopen (skeleton, "r");
1129
1130 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1131 decimal integer constant. This specifies that the line number of
1132 the *following* line of input, in its original source file, was
1133 LINENUM. */
1134 line = 2;
1135
1136 while (1)
1137 {
1138 enum line_type_e
1139 {
1140 regular_line,
1141 sync_line, /* #line. */
1142 actions_line /* %% actions. */
1143 };
1144 enum line_type_e line_type = regular_line;
1145
1146 c = getc (fskel);
1147
1148 /* Is this line special? */
1149 if (c == '#')
1150 {
1151 /* See if it's a `#line' line. */
1152 if ((c = getc (fskel)) == 'l')
1153 if ((c = getc (fskel)) == 'i')
1154 if ((c = getc (fskel)) == 'n')
1155 if ((c = getc (fskel)) == 'e')
1156 line_type = sync_line;
1157 else
1158 obstack_sgrow (&table_obstack, "#lin");
1159 else
1160 obstack_sgrow (&table_obstack, "#li");
1161 else
1162 obstack_sgrow (&table_obstack, "#l");
1163 else
1164 obstack_sgrow (&table_obstack, "#");
1165 }
1166 else if (c == '%')
1167 {
1168 /* See if it's a `%% actions' line. */
1169 if ((c = getc (fskel)) == '%')
1170 if ((c = getc (fskel)) == ' ')
1171 if ((c = getc (fskel)) == 'a')
1172 if ((c = getc (fskel)) == 'c')
1173 if ((c = getc (fskel)) == 't')
1174 if ((c = getc (fskel)) == 'i')
1175 if ((c = getc (fskel)) == 'o')
1176 if ((c = getc (fskel)) == 'n')
1177 if ((c = getc (fskel)) == 's')
1178 line_type = actions_line;
1179 else
1180 obstack_sgrow (&table_obstack, "%% action");
1181 else
1182 obstack_sgrow (&table_obstack, "%% actio");
1183 else
1184 obstack_sgrow (&table_obstack, "%% acti");
1185 else
1186 obstack_sgrow (&table_obstack, "%% act");
1187 else
1188 obstack_sgrow (&table_obstack, "%% ac");
1189 else
1190 obstack_sgrow (&table_obstack, "%% a");
1191 else
1192 obstack_sgrow (&table_obstack, "%% ");
1193 else
1194 obstack_sgrow (&table_obstack, "%%");
1195 else
1196 obstack_sgrow (&table_obstack, "%");
1197 }
1198
1199 switch (line_type)
1200 {
1201 case sync_line:
1202 if (!no_lines_flag)
1203 obstack_fgrow2 (&table_obstack, "#line %d %s\n",
1204 line, quotearg_style (c_quoting_style, skeleton));
1205
1206 /* Skip the end of line. */
1207 for (; c != '\n' && c != EOF; c = getc (fskel))
1208 /* nothing */;
1209 break;
1210
1211 case actions_line:
1212 {
1213 size_t size = obstack_object_size (&action_obstack);
1214
1215 actions_dumped++;
1216 assert (actions_dumped == 1);
1217 obstack_grow (&table_obstack,
1218 obstack_finish (&action_obstack),
1219 size);
1220 }
1221
1222 /* Skip the end of line. */
1223 for (; c != '\n' && c != EOF; c = getc (fskel))
1224 /* nothing */;
1225 break;
1226
1227 case regular_line:
1228 for (; c != '\n' && c != EOF; c = getc (fskel))
1229 obstack_1grow (&table_obstack, c);
1230 }
1231
1232 if (c == EOF)
1233 break;
1234 obstack_1grow (&table_obstack, c);
1235 line++;
1236 }
1237 assert (actions_dumped == 1);
1238 xfclose (fskel);
1239 }
1240
1241 static void
1242 output_program (void)
1243 {
1244 int c;
1245
1246 if (!no_lines_flag)
1247 obstack_fgrow2 (&table_obstack, "#line %d %s\n",
1248 lineno, quotearg_style (c_quoting_style, infile));
1249
1250 while ((c = getc (finput)) != EOF)
1251 obstack_1grow (&table_obstack, c);
1252 }
1253
1254
1255 /*----------------------------------------------------------.
1256 | Output the parsing tables and the parser code to ftable. |
1257 `----------------------------------------------------------*/
1258
1259 void
1260 output (void)
1261 {
1262 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1263
1264 /* If using a simple parser the definition of YYSTYPE are put into
1265 TABLE_OBSTACK. */
1266 if (!semantic_parser)
1267 {
1268 size_t size = obstack_object_size (&attrs_obstack);
1269 obstack_grow (&table_obstack, obstack_finish (&attrs_obstack), size);
1270 }
1271 reader_output_yylsp (&table_obstack);
1272 if (debug_flag)
1273 obstack_sgrow (&table_obstack, "\
1274 #ifndef YYDEBUG\n\
1275 # define YYDEBUG 1\n\
1276 #endif\n\
1277 \n");
1278
1279 if (semantic_parser)
1280 obstack_fgrow1 (&table_obstack, "#include %s\n",
1281 quotearg_style (c_quoting_style, attrsfile));
1282
1283 if (!no_parser_flag)
1284 obstack_sgrow (&table_obstack, "#include <stdio.h>\n\n");
1285
1286 LIST_FREE (core, first_state);
1287 output_defines ();
1288 output_token_translations ();
1289 /* if (semantic_parser) */
1290 /* This is now unconditional because debugging printouts can use it. */
1291 output_gram ();
1292 XFREE (ritem);
1293 if (semantic_parser)
1294 output_stos ();
1295 output_rule_data ();
1296 output_actions ();
1297 XFREE (state_table);
1298
1299 if (!no_parser_flag)
1300 output_parser ();
1301 output_program ();
1302 }