]>
git.saurik.com Git - bison.git/blob - src/output.c
cf5e972a5c695c9e4e06f31027b3eef3d99dbcec
1 /* Output the generated parsing program for bison,
2 Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
4 This file is part of Bison, the GNU Compiler Compiler.
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)
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.
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
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.
26 yytranslate = vector mapping yylex's token numbers into bison's token
29 ** yytname = vector of string-names indexed by bison token number
31 ** yytoknum = vector of yylex token numbers corresponding to entries
34 yyrline = vector of line-numbers of all rules. For yydebug printouts.
36 yyrhs = vector of items of all rules.
37 This is exactly what ritems contains. For yydebug and for semantic
40 yyprhs[r] = index in yyrhs of first item for rule r.
42 yyr1[r] = symbol number of symbol that rule r derives.
44 yyr2[r] = number of symbols composing right hand side of rule r.
46 * yystos[s] = the symbol number of the symbol that leads to state s.
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.
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.
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.
60 If the value in yytable is positive,
61 we shift the token and go to that state.
63 If the value is negative, it is minus a rule number to reduce by.
65 If the value is zero, the default action from yydefact[s] is used.
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.
74 yytable = a vector filled with portions for different uses,
75 found via yypact and yypgoto.
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.
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.
88 YYFINAL = the state number of the termination state.
89 YYFLAG = most negative short int. Used to flag ??
100 #include "complain.h"
104 #include "conflicts.h"
106 extern void berror
PARAMS((const char *));
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
;
129 output_short_or_char_table (struct obstack
*oout
,
132 const char *table_name
,
135 short begin
, short end
)
140 obstack_fgrow1 (oout
, "/* %s. */\n", comment
);
142 obstack_fgrow3 (oout
, "static const %s %s[] =\n{\n %6d",
143 type
, table_name
, first_value
);
146 for (i
= begin
; i
< end
; i
++)
148 obstack_1grow (oout
, ',');
152 obstack_sgrow (oout
, "\n ");
160 obstack_fgrow1 (oout
, "%6d", short_table
[i
]);
163 obstack_sgrow (oout
, "\n};\n");
168 output_short_table (struct obstack
*oout
,
170 const char *table_name
,
173 short begin
, short end
)
175 output_short_or_char_table (oout
, comment
, "short", table_name
, short_table
,
176 first_value
, begin
, end
);
180 /*--------------------------------------------------------------.
181 | output_headers -- Output constant strings to the beginning of |
183 `--------------------------------------------------------------*/
185 /* Don't put the `%s' insides quotes, since it quotearg puts them. */
190 extern int yyerror;\n\
191 extern int yycost;\n\
192 extern char * yymsg;\n\
193 extern YYSTYPE yyval;\n\
195 yyguard(n, yyvsp, yylsp)\n\
197 register YYSTYPE *yyvsp;\n\
198 register YYLTYPE *yylsp;\n\
209 extern YYSTYPE yyval;\n\
210 extern int yychar;\n\
212 yyaction(n, yyvsp, yylsp)\n\
214 register YYSTYPE *yyvsp;\n\
215 register YYLTYPE *yylsp;\n\
220 #define ACTSTR_SIMPLE "\n switch (yyn) {\n"
223 output_headers (void)
225 char *attrsfile_quoted
= 0;
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
234 attrsfile_quoted
= quotearg_style (c_quoting_style
, attrsfile
);
235 obstack_fgrow1 (&guard_obstack
, GUARDSTR
, attrsfile_quoted
);
242 obstack_fgrow1 (&action_obstack
, ACTSTR
, attrsfile_quoted
);
244 obstack_sgrow (&action_obstack
, ACTSTR_SIMPLE
);
246 /* Rename certain symbols if -p was specified. */
247 if (spec_name_prefix
)
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
);
267 /*-------------------------------------------------------.
268 | Output constant strings to the ends of certain files. |
269 `-------------------------------------------------------*/
272 output_trailers (void)
275 obstack_sgrow (&guard_obstack
, "\n }\n}\n");
277 obstack_1grow (&action_obstack
, '\n');
283 obstack_sgrow (&action_obstack
, " }\n");
285 obstack_sgrow (&action_obstack
, "}\n");
291 output_token_translations (void)
293 obstack_sgrow (&table_obstack
, "\
295 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n");
297 obstack_fgrow2 (&table_obstack
,
298 "#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\
301 max_user_token_number
, nsyms
);
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);
309 XFREE (token_translations
);
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");
322 output_short_table (&table_obstack
, NULL
, "yyprhs", rrhs
,
326 size_t yyrhs_size
= 1;
330 for (sp
= ritem
+ 1; *sp
; sp
++)
332 yyrhs
= XMALLOC (short, yyrhs_size
);
334 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
335 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
337 output_short_table (&table_obstack
, NULL
, "yyrhs", yyrhs
,
338 ritem
[0], 1, yyrhs_size
);
342 if (!semantic_parser
&& !no_parser_flag
)
343 obstack_sgrow (&table_obstack
, "\n#endif\n");
351 short *values
= (short *) alloca (sizeof (short) * nstates
);
352 for (i
= 0; i
< nstates
; ++i
)
353 values
[i
] = state_table
[i
].accessing_symbol
;
354 output_short_table (&table_obstack
,
355 "YYSTOS[STATE] -- Accessing symbol to the STATE",
362 output_rule_data (void)
366 short *short_tab
= NULL
;
368 obstack_sgrow (&table_obstack
, "\n\
369 #if YYDEBUG != 0\n");
371 output_short_table (&table_obstack
,
372 "YYRLINE[YYN] -- source line where rule number YYN was defined",
376 obstack_sgrow (&table_obstack
, "#endif\n\n");
378 if (token_table_flag
|| no_parser_flag
)
380 obstack_fgrow1 (&table_obstack
, "#define YYNTOKENS %d\n", ntokens
);
381 obstack_fgrow1 (&table_obstack
, "#define YYNNTS %d\n", nvars
);
382 obstack_fgrow1 (&table_obstack
, "#define YYNRULES %d\n", nrules
);
383 obstack_fgrow1 (&table_obstack
, "#define YYNSTATES %d\n", nstates
);
384 obstack_fgrow1 (&table_obstack
, "#define YYMAXUTOK %d\n\n",
385 max_user_token_number
);
388 /* Output the table of symbol names. */
389 if (!token_table_flag
&& !no_parser_flag
)
390 obstack_sgrow (&table_obstack
,
391 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
392 obstack_sgrow (&table_obstack
, "\
393 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
394 obstack_sgrow (&table_obstack
,
395 "static const char *const yytname[] =\n{\n ");
398 for (i
= 0; i
< nsyms
; i
++)
399 /* this used to be i<=nsyms, but that output a final "" symbol
400 almost by accident */
402 /* Width of the next token, including the two quotes, the coma
407 for (p
= tags
[i
]; p
&& *p
; p
++)
408 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
411 else if (*p
< 040 || *p
>= 0177)
416 if (j
+ strsize
> 75)
418 obstack_sgrow (&table_obstack
, "\n ");
422 obstack_1grow (&table_obstack
, '\"');
423 for (p
= tags
[i
]; p
&& *p
; p
++)
425 if (*p
== '"' || *p
== '\\')
426 obstack_fgrow1 (&table_obstack
, "\\%c", *p
);
428 obstack_sgrow (&table_obstack
, "\\n");
430 obstack_sgrow (&table_obstack
, "\\t");
432 obstack_sgrow (&table_obstack
, "\\b");
433 else if (*p
< 040 || *p
>= 0177)
434 obstack_fgrow1 (&table_obstack
, "\\%03o", *p
);
436 obstack_1grow (&table_obstack
, *p
);
439 obstack_sgrow (&table_obstack
, "\", ");
442 /* add a NULL entry to list of tokens */
443 obstack_sgrow (&table_obstack
, "NULL\n};\n");
445 if (!token_table_flag
&& !no_parser_flag
)
446 obstack_sgrow (&table_obstack
, "#endif\n\n");
448 /* Output YYTOKNUM. */
449 if (token_table_flag
)
451 output_short_table (&table_obstack
,
452 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
453 "yytoknum", user_toknums
,
458 output_short_table (&table_obstack
,
459 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
464 obstack_1grow (&table_obstack
, '\n');
467 short_tab
= XMALLOC (short, nrules
+ 1);
468 for (i
= 1; i
< nrules
; i
++)
469 short_tab
[i
] = rrhs
[i
+ 1] - rrhs
[i
] - 1;
470 short_tab
[nrules
] = nitems
- rrhs
[nrules
] - 1;
471 output_short_table (&table_obstack
,
472 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
475 obstack_1grow (&table_obstack
, '\n');
484 output_defines (void)
486 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
);
487 obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
);
488 obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
);
492 /*------------------------------------------------------------------.
493 | Decide what to do for each type of token if seen as the lookahead |
494 | token in specified state. The value returned is used as the |
495 | default action (yydefact) for the state. In addition, actrow is |
496 | filled with what to do for each kind of token, index by symbol |
497 | number, with zero meaning do the default action. The value |
498 | MINSHORT, a very negative number, means this situation is an |
499 | error. The parser recognizes this value specially. |
501 | This is where conflicts are resolved. The loop over lookahead |
502 | rules considered lower-numbered rules last, and the last rule |
503 | considered that likes a token gets to handle it. |
504 `------------------------------------------------------------------*/
507 action_row (int state
)
526 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
528 for (i
= 0; i
< ntokens
; i
++)
533 redp
= reduction_table
[state
];
541 /* loop over all the rules available here which require
543 m
= lookaheads
[state
];
544 n
= lookaheads
[state
+ 1];
546 for (i
= n
- 1; i
>= m
; i
--)
549 wordp
= LA
+ i
* tokensetsize
;
552 /* and find each token which the rule finds acceptable
554 for (j
= 0; j
< ntokens
; j
++)
556 /* and record this rule as the rule to use if that
572 shiftp
= shift_table
[state
];
574 /* Now see which tokens are allowed for shifts in this state. For
575 them, record the shift as the thing to do. So shift is preferred
582 for (i
= 0; i
< k
; i
++)
584 shift_state
= shiftp
->shifts
[i
];
588 symbol
= state_table
[shift_state
].accessing_symbol
;
593 actrow
[symbol
] = shift_state
;
595 /* Do not use any default reduction if there is a shift for
597 if (symbol
== error_token_number
)
602 errp
= err_table
[state
];
604 /* See which tokens are an explicit error in this state (due to
605 %nonassoc). For them, record MINSHORT as the action. */
611 for (i
= 0; i
< k
; i
++)
613 symbol
= errp
->errs
[i
];
614 actrow
[symbol
] = MINSHORT
;
618 /* Now find the most common reduction and make it the default action
621 if (nreds
>= 1 && !nodefault
)
623 if (consistent
[state
])
624 default_rule
= redp
->rules
[0];
628 for (i
= m
; i
< n
; i
++)
633 for (j
= 0; j
< ntokens
; j
++)
635 if (actrow
[j
] == rule
)
646 /* actions which match the default are replaced with zero,
647 which means "use the default" */
651 for (j
= 0; j
< ntokens
; j
++)
653 if (actrow
[j
] == default_rule
)
657 default_rule
= -default_rule
;
662 /* If have no default rule, the default is an error.
663 So replace any action which says "error" with "use default". */
665 if (default_rule
== 0)
666 for (j
= 0; j
< ntokens
; j
++)
668 if (actrow
[j
] == MINSHORT
)
686 for (i
= 0; i
< ntokens
; i
++)
695 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
696 tos
[state
] = sp2
= XCALLOC (short, count
);
698 for (i
= 0; i
< ntokens
; i
++)
707 tally
[state
] = count
;
708 width
[state
] = sp1
[-1] - sp
[0] + 1;
712 /*------------------------------------------------------------------.
713 | Figure out the actions for the specified state, indexed by |
714 | lookahead token type. |
716 | The YYDEFACT table is output now. The detailed info is saved for |
717 | putting into YYTABLE later. |
718 `------------------------------------------------------------------*/
724 short *yydefact
= XCALLOC (short, nstates
);
726 actrow
= XCALLOC (short, ntokens
);
727 for (i
= 0; i
< nstates
; ++i
)
729 yydefact
[i
] = action_row (i
);
734 output_short_table (&table_obstack
,
735 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
736 doesn't specify something else to do. Zero means the default is an\n\
738 "yydefact", yydefact
,
739 yydefact
[0], 1, nstates
);
740 obstack_1grow (&table_obstack
, '\n');
748 shifts
*sp
, *sptmp
; /* JF derefrenced freed ptr */
752 for (sp
= first_shift
; sp
; sp
= sptmp
)
761 free_reductions (void)
763 reductions
*rp
, *rptmp
; /* JF fixed freed ptr */
765 XFREE (reduction_table
);
767 for (rp
= first_reduction
; rp
; rp
= rptmp
)
777 save_column (int symbol
, int default_state
)
786 short begin
= goto_map
[symbol
];
787 short end
= goto_map
[symbol
+ 1];
790 for (i
= begin
; i
< end
; i
++)
792 if (to_state
[i
] != default_state
)
799 symno
= symbol
- ntokens
+ nstates
;
801 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
802 tos
[symno
] = sp2
= XCALLOC (short, count
);
804 for (i
= begin
; i
< end
; i
++)
806 if (to_state
[i
] != default_state
)
808 *sp1
++ = from_state
[i
];
809 *sp2
++ = to_state
[i
];
813 tally
[symno
] = count
;
814 width
[symno
] = sp1
[-1] - sp
[0] + 1;
818 default_goto (int symbol
)
826 m
= goto_map
[symbol
];
827 n
= goto_map
[symbol
+ 1];
832 for (i
= 0; i
< nstates
; i
++)
835 for (i
= m
; i
< n
; i
++)
836 state_count
[to_state
[i
]]++;
841 for (i
= 0; i
< nstates
; i
++)
843 if (state_count
[i
] > max
)
845 max
= state_count
[i
];
850 return default_state
;
854 /*-------------------------------------------------------------------.
855 | Figure out what to do after reducing with each rule, depending on |
856 | the saved state from before the beginning of parsing the data that |
857 | matched this rule. |
859 | The YYDEFGOTO table is output now. The detailed info is saved for |
860 | putting into YYTABLE later. |
861 `-------------------------------------------------------------------*/
868 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
869 state_count
= XCALLOC (short, nstates
);
871 for (i
= ntokens
; i
< nsyms
; ++i
)
873 int default_state
= default_goto (i
);
874 save_column (i
, default_state
);
875 yydefgoto
[i
- ntokens
] = default_state
;
878 output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
,
879 yydefgoto
[0], 1, nsyms
- ntokens
);
886 /* The next few functions decide how to pack the actions and gotos
887 information into yytable. */
898 order
= XCALLOC (short, nvectors
);
901 for (i
= 0; i
< nvectors
; i
++)
909 while (j
>= 0 && (width
[order
[j
]] < w
))
912 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
915 for (k
= nentries
- 1; k
> j
; k
--)
916 order
[k
+ 1] = order
[k
];
926 matching_state (int vector
)
943 for (prev
= vector
- 1; prev
>= 0; prev
--)
946 if (width
[j
] != w
|| tally
[j
] != t
)
950 for (k
= 0; match
&& k
< t
; k
++)
952 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
965 pack_vector (int vector
)
984 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
988 for (k
= 0; ok
&& k
< t
; k
++)
992 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
998 for (k
= 0; ok
&& k
< vector
; k
++)
1006 for (k
= 0; k
< t
; k
++)
1010 check
[loc
] = from
[k
];
1013 while (table
[lowzero
] != 0)
1023 berror ("pack_vector");
1024 return 0; /* JF keep lint happy */
1035 base
= XCALLOC (short, nvectors
);
1036 pos
= XCALLOC (short, nentries
);
1037 table
= XCALLOC (short, MAXTABLE
);
1038 check
= XCALLOC (short, MAXTABLE
);
1043 for (i
= 0; i
< nvectors
; i
++)
1046 for (i
= 0; i
< MAXTABLE
; i
++)
1049 for (i
= 0; i
< nentries
; i
++)
1051 state
= matching_state (i
);
1054 place
= pack_vector (i
);
1056 place
= base
[state
];
1059 base
[order
[i
]] = place
;
1062 for (i
= 0; i
< nvectors
; i
++)
1075 /* the following functions output yytable, yycheck
1076 and the vectors whose elements index the portion starts */
1081 output_short_table (&table_obstack
, NULL
, "yypact", base
,
1082 base
[0], 1, nstates
);
1084 obstack_1grow (&table_obstack
, '\n');
1086 output_short_table (&table_obstack
, NULL
, "yypgoto", base
,
1087 base
[nstates
], nstates
+ 1, nvectors
);
1096 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
);
1097 output_short_table (&table_obstack
, NULL
, "yytable", table
,
1098 table
[0], 1, high
+ 1);
1106 output_short_table (&table_obstack
, NULL
, "yycheck", check
,
1107 check
[0], 1, high
+ 1);
1111 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1115 output_actions (void)
1117 nvectors
= nstates
+ nvars
;
1119 froms
= XCALLOC (short *, nvectors
);
1120 tos
= XCALLOC (short *, nvectors
);
1121 tally
= XCALLOC (short, nvectors
);
1122 width
= XCALLOC (short, nvectors
);
1132 XFREE (goto_map
+ ntokens
);
1138 obstack_1grow (&table_obstack
, '\n');
1141 obstack_1grow (&table_obstack
, '\n');
1145 /*------------------------------------------.
1146 | Copy the parser code into TABLE_OBSTACK. |
1147 `------------------------------------------*/
1150 output_parser (void)
1155 int actions_dumped
= 0;
1158 obstack_sgrow (&table_obstack
, "#define YYPURE 1\n\n");
1160 /* Loop over lines in the standard parser file. */
1163 if (semantic_parser
)
1164 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1166 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1169 fskel
= xfopen (skeleton
, "r");
1171 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1172 decimal integer constant. This specifies that the line number of
1173 the *following* line of input, in its original source file, was
1182 sync_line
, /* #line. */
1183 actions_line
/* %% actions. */
1185 enum line_type_e line_type
= regular_line
;
1189 /* Is this line special? */
1192 /* See if it's a `#line' line. */
1193 if ((c
= getc (fskel
)) == 'l')
1194 if ((c
= getc (fskel
)) == 'i')
1195 if ((c
= getc (fskel
)) == 'n')
1196 if ((c
= getc (fskel
)) == 'e')
1197 line_type
= sync_line
;
1199 obstack_sgrow (&table_obstack
, "#lin");
1201 obstack_sgrow (&table_obstack
, "#li");
1203 obstack_sgrow (&table_obstack
, "#l");
1205 obstack_sgrow (&table_obstack
, "#");
1209 /* See if it's a `%% actions' line. */
1210 if ((c
= getc (fskel
)) == '%')
1211 if ((c
= getc (fskel
)) == ' ')
1212 if ((c
= getc (fskel
)) == 'a')
1213 if ((c
= getc (fskel
)) == 'c')
1214 if ((c
= getc (fskel
)) == 't')
1215 if ((c
= getc (fskel
)) == 'i')
1216 if ((c
= getc (fskel
)) == 'o')
1217 if ((c
= getc (fskel
)) == 'n')
1218 if ((c
= getc (fskel
)) == 's')
1219 line_type
= actions_line
;
1221 obstack_sgrow (&table_obstack
, "%% action");
1223 obstack_sgrow (&table_obstack
, "%% actio");
1225 obstack_sgrow (&table_obstack
, "%% acti");
1227 obstack_sgrow (&table_obstack
, "%% act");
1229 obstack_sgrow (&table_obstack
, "%% ac");
1231 obstack_sgrow (&table_obstack
, "%% a");
1233 obstack_sgrow (&table_obstack
, "%% ");
1235 obstack_sgrow (&table_obstack
, "%%");
1237 obstack_sgrow (&table_obstack
, "%");
1244 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1245 line
, quotearg_style (c_quoting_style
, skeleton
));
1247 /* Skip the end of line. */
1248 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1254 size_t size
= obstack_object_size (&action_obstack
);
1257 assert (actions_dumped
== 1);
1258 obstack_grow (&table_obstack
,
1259 obstack_finish (&action_obstack
),
1263 /* Skip the end of line. */
1264 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1269 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1270 obstack_1grow (&table_obstack
, c
);
1275 obstack_1grow (&table_obstack
, c
);
1278 assert (actions_dumped
== 1);
1283 output_program (void)
1288 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1289 lineno
, quotearg_style (c_quoting_style
, infile
));
1291 while ((c
= getc (finput
)) != EOF
)
1292 obstack_1grow (&table_obstack
, c
);
1297 free_itemsets (void)
1300 for (cp
= first_state
; cp
; cp
= cptmp
)
1308 /*----------------------------------------------------------.
1309 | Output the parsing tables and the parser code to ftable. |
1310 `----------------------------------------------------------*/
1315 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1317 /* If using a simple parser the definition of YYSTYPE are put into
1319 if (!semantic_parser
)
1321 size_t size
= obstack_object_size (&attrs_obstack
);
1322 obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
);
1324 reader_output_yylsp (&table_obstack
);
1326 obstack_sgrow (&table_obstack
, "\
1328 # define YYDEBUG 1\n\
1332 if (semantic_parser
)
1333 obstack_fgrow1 (&table_obstack
, "#include %s\n",
1334 quotearg_style (c_quoting_style
, attrsfile
));
1336 if (!no_parser_flag
)
1337 obstack_sgrow (&table_obstack
, "#include <stdio.h>\n\n");
1341 output_token_translations ();
1342 /* if (semantic_parser) */
1343 /* This is now unconditional because debugging printouts can use it. */
1346 if (semantic_parser
)
1348 output_rule_data ();
1350 XFREE (state_table
);
1352 if (!no_parser_flag
)