]>
git.saurik.com Git - bison.git/blob - src/output.c
83476c5f43ac5877131c0d57b7ed3148d504eeeb
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 ??
101 #include "complain.h"
105 #include "conflicts.h"
107 extern void berror
PARAMS((const char *));
113 static short **froms
= NULL
;
114 static short **tos
= NULL
;
115 static short *tally
= NULL
;
116 static short *width
= NULL
;
117 static short *actrow
= NULL
;
118 static short *state_count
= NULL
;
119 static short *order
= NULL
;
120 static short *base
= NULL
;
121 static short *pos
= NULL
;
122 static short *table
= NULL
;
123 static short *check
= NULL
;
130 output_short_or_char_table (struct obstack
*oout
,
133 const char *table_name
,
136 short begin
, short end
)
141 obstack_fgrow1 (oout
, "/* %s. */\n", comment
);
143 obstack_fgrow3 (oout
, "static const %s %s[] =\n{\n %6d",
144 type
, table_name
, first_value
);
147 for (i
= begin
; i
< end
; i
++)
149 obstack_1grow (oout
, ',');
153 obstack_sgrow (oout
, "\n ");
161 obstack_fgrow1 (oout
, "%6d", short_table
[i
]);
164 obstack_sgrow (oout
, "\n};\n");
169 output_short_table (struct obstack
*oout
,
171 const char *table_name
,
174 short begin
, short end
)
176 output_short_or_char_table (oout
, comment
, "short", table_name
, short_table
,
177 first_value
, begin
, end
);
181 /*--------------------------------------------------------------.
182 | output_headers -- Output constant strings to the beginning of |
184 `--------------------------------------------------------------*/
186 /* Don't put the `%s' insides quotes, since it quotearg puts them. */
191 extern int yyerror;\n\
192 extern int yycost;\n\
193 extern char * yymsg;\n\
194 extern YYSTYPE yyval;\n\
196 yyguard(n, yyvsp, yylsp)\n\
198 register YYSTYPE *yyvsp;\n\
199 register YYLTYPE *yylsp;\n\
210 extern YYSTYPE yyval;\n\
211 extern int yychar;\n\
213 yyaction(n, yyvsp, yylsp)\n\
215 register YYSTYPE *yyvsp;\n\
216 register YYLTYPE *yylsp;\n\
221 #define ACTSTR_SIMPLE "\n switch (yyn) {\n"
224 output_headers (void)
226 char *attrsfile_quoted
= 0;
230 /* FIXME: This is *buggy*. ATTRSFILE is not computed yet, since
231 we are waiting for the full input file to have been read to
232 be sure of the output file name. So basically, here, a SEGV
233 is guaranteed. OTOH, currently semantic parsers are not
235 attrsfile_quoted
= quotearg_style (c_quoting_style
, attrsfile
);
236 obstack_fgrow1 (&guard_obstack
, GUARDSTR
, attrsfile_quoted
);
243 obstack_fgrow1 (&action_obstack
, ACTSTR
, attrsfile_quoted
);
245 obstack_sgrow (&action_obstack
, ACTSTR_SIMPLE
);
247 /* Rename certain symbols if -p was specified. */
248 if (spec_name_prefix
)
250 obstack_fgrow1 (&table_obstack
,
251 "#define yyparse %sparse\n", spec_name_prefix
);
252 obstack_fgrow1 (&table_obstack
,
253 "#define yylex %slex\n", spec_name_prefix
);
254 obstack_fgrow1 (&table_obstack
,
255 "#define yyerror %serror\n", spec_name_prefix
);
256 obstack_fgrow1 (&table_obstack
,
257 "#define yylval %slval\n", spec_name_prefix
);
258 obstack_fgrow1 (&table_obstack
,
259 "#define yychar %schar\n", spec_name_prefix
);
260 obstack_fgrow1 (&table_obstack
,
261 "#define yydebug %sdebug\n", spec_name_prefix
);
262 obstack_fgrow1 (&table_obstack
,
263 "#define yynerrs %snerrs\n", spec_name_prefix
);
268 /*-------------------------------------------------------.
269 | Output constant strings to the ends of certain files. |
270 `-------------------------------------------------------*/
273 output_trailers (void)
276 obstack_sgrow (&guard_obstack
, "\n }\n}\n");
278 obstack_1grow (&action_obstack
, '\n');
284 obstack_sgrow (&action_obstack
, " }\n");
286 obstack_sgrow (&action_obstack
, "}\n");
292 output_token_translations (void)
294 obstack_sgrow (&table_obstack
, "\
296 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n");
298 obstack_fgrow2 (&table_obstack
,
299 "#define YYTRANSLATE(x) ((unsigned)(x) <= %d ? yytranslate[x] : %d)\
302 max_user_token_number
, nsyms
);
304 output_short_or_char_table (&table_obstack
,
305 "YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX",
306 ntokens
< 127 ? "char" : "short",
307 "yytranslate", token_translations
,
308 0, 1, max_user_token_number
+ 1);
310 XFREE (token_translations
);
317 /* With the ordinary parser,
318 yyprhs and yyrhs are needed only for yydebug. */
319 /* With the no_parser option, all tables are generated */
320 if (!semantic_parser
&& !no_parser_flag
)
321 obstack_sgrow (&table_obstack
, "\n#if YYDEBUG != 0\n");
323 output_short_table (&table_obstack
, NULL
, "yyprhs", rrhs
,
327 size_t yyrhs_size
= 1;
331 for (sp
= ritem
+ 1; *sp
; sp
++)
333 yyrhs
= XMALLOC (short, yyrhs_size
);
335 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
336 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
338 output_short_table (&table_obstack
, NULL
, "yyrhs", yyrhs
,
339 ritem
[0], 1, yyrhs_size
);
343 if (!semantic_parser
&& !no_parser_flag
)
344 obstack_sgrow (&table_obstack
, "\n#endif\n");
351 output_short_table (&table_obstack
, NULL
, "yystos", accessing_symbol
,
357 output_rule_data (void)
361 short *short_tab
= NULL
;
363 obstack_sgrow (&table_obstack
, "\n\
364 #if YYDEBUG != 0\n");
366 output_short_table (&table_obstack
,
367 "YYRLINE[YYN] -- source line where rule number YYN was defined",
371 obstack_sgrow (&table_obstack
, "#endif\n\n");
373 if (token_table_flag
|| no_parser_flag
)
375 obstack_fgrow1 (&table_obstack
, "#define YYNTOKENS %d\n", ntokens
);
376 obstack_fgrow1 (&table_obstack
, "#define YYNNTS %d\n", nvars
);
377 obstack_fgrow1 (&table_obstack
, "#define YYNRULES %d\n", nrules
);
378 obstack_fgrow1 (&table_obstack
, "#define YYNSTATES %d\n", nstates
);
379 obstack_fgrow1 (&table_obstack
, "#define YYMAXUTOK %d\n\n",
380 max_user_token_number
);
383 /* Output the table of symbol names. */
384 if (!token_table_flag
&& !no_parser_flag
)
385 obstack_sgrow (&table_obstack
,
386 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
387 obstack_sgrow (&table_obstack
, "\
388 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
389 obstack_sgrow (&table_obstack
,
390 "static const char *const yytname[] =\n{\n ");
393 for (i
= 0; i
< nsyms
; i
++)
394 /* this used to be i<=nsyms, but that output a final "" symbol
395 almost by accident */
397 /* Width of the next token, including the two quotes, the coma
402 for (p
= tags
[i
]; p
&& *p
; p
++)
403 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
406 else if (*p
< 040 || *p
>= 0177)
411 if (j
+ strsize
> 75)
413 obstack_sgrow (&table_obstack
, "\n ");
417 obstack_1grow (&table_obstack
, '\"');
418 for (p
= tags
[i
]; p
&& *p
; p
++)
420 if (*p
== '"' || *p
== '\\')
421 obstack_fgrow1 (&table_obstack
, "\\%c", *p
);
423 obstack_sgrow (&table_obstack
, "\\n");
425 obstack_sgrow (&table_obstack
, "\\t");
427 obstack_sgrow (&table_obstack
, "\\b");
428 else if (*p
< 040 || *p
>= 0177)
429 obstack_fgrow1 (&table_obstack
, "\\%03o", *p
);
431 obstack_1grow (&table_obstack
, *p
);
434 obstack_sgrow (&table_obstack
, "\", ");
437 /* add a NULL entry to list of tokens */
438 obstack_sgrow (&table_obstack
, "NULL\n};\n");
440 if (!token_table_flag
&& !no_parser_flag
)
441 obstack_sgrow (&table_obstack
, "#endif\n\n");
443 /* Output YYTOKNUM. */
444 if (token_table_flag
)
446 output_short_table (&table_obstack
,
447 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
448 "yytoknum", user_toknums
,
453 output_short_table (&table_obstack
,
454 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
459 obstack_1grow (&table_obstack
, '\n');
462 short_tab
= XMALLOC (short, nrules
+ 1);
463 for (i
= 1; i
< nrules
; i
++)
464 short_tab
[i
] = rrhs
[i
+ 1] - rrhs
[i
] - 1;
465 short_tab
[nrules
] = nitems
- rrhs
[nrules
] - 1;
466 output_short_table (&table_obstack
,
467 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
470 obstack_1grow (&table_obstack
, '\n');
479 output_defines (void)
481 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
);
482 obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
);
483 obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
);
487 /*------------------------------------------------------------------.
488 | Decide what to do for each type of token if seen as the lookahead |
489 | token in specified state. The value returned is used as the |
490 | default action (yydefact) for the state. In addition, actrow is |
491 | filled with what to do for each kind of token, index by symbol |
492 | number, with zero meaning do the default action. The value |
493 | MINSHORT, a very negative number, means this situation is an |
494 | error. The parser recognizes this value specially. |
496 | This is where conflicts are resolved. The loop over lookahead |
497 | rules considered lower-numbered rules last, and the last rule |
498 | considered that likes a token gets to handle it. |
499 `------------------------------------------------------------------*/
502 action_row (int state
)
521 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
523 for (i
= 0; i
< ntokens
; i
++)
528 redp
= reduction_table
[state
];
536 /* loop over all the rules available here which require
538 m
= lookaheads
[state
];
539 n
= lookaheads
[state
+ 1];
541 for (i
= n
- 1; i
>= m
; i
--)
544 wordp
= LA
+ i
* tokensetsize
;
547 /* and find each token which the rule finds acceptable
549 for (j
= 0; j
< ntokens
; j
++)
551 /* and record this rule as the rule to use if that
567 shiftp
= shift_table
[state
];
569 /* Now see which tokens are allowed for shifts in this state. For
570 them, record the shift as the thing to do. So shift is preferred
577 for (i
= 0; i
< k
; i
++)
579 shift_state
= shiftp
->shifts
[i
];
583 symbol
= accessing_symbol
[shift_state
];
588 actrow
[symbol
] = shift_state
;
590 /* Do not use any default reduction if there is a shift for
592 if (symbol
== error_token_number
)
597 errp
= err_table
[state
];
599 /* See which tokens are an explicit error in this state (due to
600 %nonassoc). For them, record MINSHORT as the action. */
606 for (i
= 0; i
< k
; i
++)
608 symbol
= errp
->errs
[i
];
609 actrow
[symbol
] = MINSHORT
;
613 /* Now find the most common reduction and make it the default action
616 if (nreds
>= 1 && !nodefault
)
618 if (consistent
[state
])
619 default_rule
= redp
->rules
[0];
623 for (i
= m
; i
< n
; i
++)
628 for (j
= 0; j
< ntokens
; j
++)
630 if (actrow
[j
] == rule
)
641 /* actions which match the default are replaced with zero,
642 which means "use the default" */
646 for (j
= 0; j
< ntokens
; j
++)
648 if (actrow
[j
] == default_rule
)
652 default_rule
= -default_rule
;
657 /* If have no default rule, the default is an error.
658 So replace any action which says "error" with "use default". */
660 if (default_rule
== 0)
661 for (j
= 0; j
< ntokens
; j
++)
663 if (actrow
[j
] == MINSHORT
)
681 for (i
= 0; i
< ntokens
; i
++)
690 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
691 tos
[state
] = sp2
= XCALLOC (short, count
);
693 for (i
= 0; i
< ntokens
; i
++)
702 tally
[state
] = count
;
703 width
[state
] = sp1
[-1] - sp
[0] + 1;
707 /*------------------------------------------------------------------.
708 | Figure out the actions for the specified state, indexed by |
709 | lookahead token type. |
711 | The YYDEFACT table is output now. The detailed info is saved for |
712 | putting into YYTABLE later. |
713 `------------------------------------------------------------------*/
719 short *yydefact
= XCALLOC (short, nstates
);
721 actrow
= XCALLOC (short, ntokens
);
722 for (i
= 0; i
< nstates
; ++i
)
724 yydefact
[i
] = action_row (i
);
729 output_short_table (&table_obstack
,
730 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
731 doesn't specify something else to do. Zero means the default is an\n\
733 "yydefact", yydefact
,
734 yydefact
[0], 1, nstates
);
735 obstack_1grow (&table_obstack
, '\n');
743 shifts
*sp
, *sptmp
; /* JF derefrenced freed ptr */
747 for (sp
= first_shift
; sp
; sp
= sptmp
)
756 free_reductions (void)
758 reductions
*rp
, *rptmp
; /* JF fixed freed ptr */
760 XFREE (reduction_table
);
762 for (rp
= first_reduction
; rp
; rp
= rptmp
)
772 save_column (int symbol
, int default_state
)
781 short begin
= goto_map
[symbol
];
782 short end
= goto_map
[symbol
+ 1];
785 for (i
= begin
; i
< end
; i
++)
787 if (to_state
[i
] != default_state
)
794 symno
= symbol
- ntokens
+ nstates
;
796 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
797 tos
[symno
] = sp2
= XCALLOC (short, count
);
799 for (i
= begin
; i
< end
; i
++)
801 if (to_state
[i
] != default_state
)
803 *sp1
++ = from_state
[i
];
804 *sp2
++ = to_state
[i
];
808 tally
[symno
] = count
;
809 width
[symno
] = sp1
[-1] - sp
[0] + 1;
813 default_goto (int symbol
)
821 m
= goto_map
[symbol
];
822 n
= goto_map
[symbol
+ 1];
827 for (i
= 0; i
< nstates
; i
++)
830 for (i
= m
; i
< n
; i
++)
831 state_count
[to_state
[i
]]++;
836 for (i
= 0; i
< nstates
; i
++)
838 if (state_count
[i
] > max
)
840 max
= state_count
[i
];
845 return default_state
;
849 /*-------------------------------------------------------------------.
850 | Figure out what to do after reducing with each rule, depending on |
851 | the saved state from before the beginning of parsing the data that |
852 | matched this rule. |
854 | The YYDEFGOTO table is output now. The detailed info is saved for |
855 | putting into YYTABLE later. |
856 `-------------------------------------------------------------------*/
863 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
864 state_count
= XCALLOC (short, nstates
);
866 for (i
= ntokens
; i
< nsyms
; ++i
)
868 int default_state
= default_goto (i
);
869 save_column (i
, default_state
);
870 yydefgoto
[i
- ntokens
] = default_state
;
873 output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
,
874 yydefgoto
[0], 1, nsyms
- ntokens
);
881 /* The next few functions decide how to pack the actions and gotos
882 information into yytable. */
893 order
= XCALLOC (short, nvectors
);
896 for (i
= 0; i
< nvectors
; i
++)
904 while (j
>= 0 && (width
[order
[j
]] < w
))
907 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
910 for (k
= nentries
- 1; k
> j
; k
--)
911 order
[k
+ 1] = order
[k
];
921 matching_state (int vector
)
938 for (prev
= vector
- 1; prev
>= 0; prev
--)
941 if (width
[j
] != w
|| tally
[j
] != t
)
945 for (k
= 0; match
&& k
< t
; k
++)
947 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
960 pack_vector (int vector
)
979 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
983 for (k
= 0; ok
&& k
< t
; k
++)
987 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
993 for (k
= 0; ok
&& k
< vector
; k
++)
1001 for (k
= 0; k
< t
; k
++)
1005 check
[loc
] = from
[k
];
1008 while (table
[lowzero
] != 0)
1018 berror ("pack_vector");
1019 return 0; /* JF keep lint happy */
1030 base
= XCALLOC (short, nvectors
);
1031 pos
= XCALLOC (short, nentries
);
1032 table
= XCALLOC (short, MAXTABLE
);
1033 check
= XCALLOC (short, MAXTABLE
);
1038 for (i
= 0; i
< nvectors
; i
++)
1041 for (i
= 0; i
< MAXTABLE
; i
++)
1044 for (i
= 0; i
< nentries
; i
++)
1046 state
= matching_state (i
);
1049 place
= pack_vector (i
);
1051 place
= base
[state
];
1054 base
[order
[i
]] = place
;
1057 for (i
= 0; i
< nvectors
; i
++)
1070 /* the following functions output yytable, yycheck
1071 and the vectors whose elements index the portion starts */
1076 output_short_table (&table_obstack
, NULL
, "yypact", base
,
1077 base
[0], 1, nstates
);
1079 obstack_1grow (&table_obstack
, '\n');
1081 output_short_table (&table_obstack
, NULL
, "yypgoto", base
,
1082 base
[nstates
], nstates
+ 1, nvectors
);
1091 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
);
1092 output_short_table (&table_obstack
, NULL
, "yytable", table
,
1093 table
[0], 1, high
+ 1);
1101 output_short_table (&table_obstack
, NULL
, "yycheck", check
,
1102 check
[0], 1, high
+ 1);
1106 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1110 output_actions (void)
1112 nvectors
= nstates
+ nvars
;
1114 froms
= XCALLOC (short *, nvectors
);
1115 tos
= XCALLOC (short *, nvectors
);
1116 tally
= XCALLOC (short, nvectors
);
1117 width
= XCALLOC (short, nvectors
);
1125 XFREE (accessing_symbol
);
1128 XFREE (goto_map
+ ntokens
);
1134 obstack_1grow (&table_obstack
, '\n');
1137 obstack_1grow (&table_obstack
, '\n');
1141 /*------------------------------------------.
1142 | Copy the parser code into TABLE_OBSTACK. |
1143 `------------------------------------------*/
1146 output_parser (void)
1151 int actions_dumped
= 0;
1154 obstack_sgrow (&table_obstack
, "#define YYPURE 1\n\n");
1156 /* Loop over lines in the standard parser file. */
1159 if (semantic_parser
)
1160 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1162 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1164 fskel
= xfopen (skeleton
, "r");
1166 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1167 decimal integer constant. This specifies that the line number of
1168 the *following* line of input, in its original source file, was
1177 sync_line
, /* #line. */
1178 actions_line
/* %% actions. */
1180 enum line_type_e line_type
= regular_line
;
1184 /* Is this line special? */
1187 /* See if it's a `#line' line. */
1188 if ((c
= getc (fskel
)) == 'l')
1189 if ((c
= getc (fskel
)) == 'i')
1190 if ((c
= getc (fskel
)) == 'n')
1191 if ((c
= getc (fskel
)) == 'e')
1192 line_type
= sync_line
;
1194 obstack_sgrow (&table_obstack
, "#lin");
1196 obstack_sgrow (&table_obstack
, "#li");
1198 obstack_sgrow (&table_obstack
, "#l");
1200 obstack_sgrow (&table_obstack
, "#");
1204 /* See if it's a `%% actions' line. */
1205 if ((c
= getc (fskel
)) == '%')
1206 if ((c
= getc (fskel
)) == ' ')
1207 if ((c
= getc (fskel
)) == 'a')
1208 if ((c
= getc (fskel
)) == 'c')
1209 if ((c
= getc (fskel
)) == 't')
1210 if ((c
= getc (fskel
)) == 'i')
1211 if ((c
= getc (fskel
)) == 'o')
1212 if ((c
= getc (fskel
)) == 'n')
1213 if ((c
= getc (fskel
)) == 's')
1214 line_type
= actions_line
;
1216 obstack_sgrow (&table_obstack
, "%% action");
1218 obstack_sgrow (&table_obstack
, "%% actio");
1220 obstack_sgrow (&table_obstack
, "%% acti");
1222 obstack_sgrow (&table_obstack
, "%% act");
1224 obstack_sgrow (&table_obstack
, "%% ac");
1226 obstack_sgrow (&table_obstack
, "%% a");
1228 obstack_sgrow (&table_obstack
, "%% ");
1230 obstack_sgrow (&table_obstack
, "%%");
1232 obstack_sgrow (&table_obstack
, "%");
1239 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1240 line
, quotearg_style (c_quoting_style
, skeleton
));
1242 /* Skip the end of line. */
1243 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1249 size_t size
= obstack_object_size (&action_obstack
);
1252 assert (actions_dumped
== 1);
1253 obstack_grow (&table_obstack
,
1254 obstack_finish (&action_obstack
),
1258 /* Skip the end of line. */
1259 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1264 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1265 obstack_1grow (&table_obstack
, c
);
1270 obstack_1grow (&table_obstack
, c
);
1273 assert (actions_dumped
== 1);
1278 output_program (void)
1283 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1284 lineno
, quotearg_style (c_quoting_style
, infile
));
1286 while ((c
= getc (finput
)) != EOF
)
1287 obstack_1grow (&table_obstack
, c
);
1292 free_itemsets (void)
1296 XFREE (state_table
);
1298 for (cp
= first_state
; cp
; cp
= cptmp
)
1306 /*----------------------------------------------------------.
1307 | Output the parsing tables and the parser code to ftable. |
1308 `----------------------------------------------------------*/
1313 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1315 /* If using a simple parser the definition of YYSTYPE are put into
1317 if (!semantic_parser
)
1319 size_t size
= obstack_object_size (&attrs_obstack
);
1320 obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
);
1322 reader_output_yylsp (&table_obstack
);
1324 obstack_sgrow (&table_obstack
, "\
1326 # define YYDEBUG 1\n\
1330 if (semantic_parser
)
1331 obstack_fgrow1 (&table_obstack
, "#include %s\n",
1332 quotearg_style (c_quoting_style
, attrsfile
));
1334 if (!no_parser_flag
)
1335 obstack_sgrow (&table_obstack
, "#include <stdio.h>\n\n");
1339 output_token_translations ();
1340 /* if (semantic_parser) */
1341 /* This is now unconditional because debugging printouts can use it. */
1344 if (semantic_parser
)
1346 output_rule_data ();
1348 if (!no_parser_flag
)