]>
git.saurik.com Git - bison.git/blob - src/output.c
609d980163d99c222a0514fc8e7842e4db84ec36
1 /* Output the generated parsing program for bison,
2 Copyright 1984, 1986, 1989, 1992, 2000 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
;
117 static short *actrow
;
118 static short *state_count
;
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_grow_string (oout
, "\n ");
161 obstack_fgrow1 (oout
, "%6d", short_table
[i
]);
164 obstack_grow_string (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
= quotearg_style (c_quoting_style
, attrsfile
);
229 fprintf (fguard
, GUARDSTR
, attrsfile_quoted
);
235 obstack_fgrow1 (&action_obstack
, ACTSTR
, attrsfile_quoted
);
237 obstack_grow_string (&action_obstack
, ACTSTR_SIMPLE
);
239 /* if (semantic_parser) JF moved this below
240 fprintf(ftable, "#include \"%s\"\n", attrsfile);
241 fprintf(ftable, "#include <stdio.h>\n\n");
244 /* Rename certain symbols if -p was specified. */
245 if (spec_name_prefix
)
247 obstack_fgrow1 (&table_obstack
,
248 "#define yyparse %sparse\n", spec_name_prefix
);
249 obstack_fgrow1 (&table_obstack
,
250 "#define yylex %slex\n", spec_name_prefix
);
251 obstack_fgrow1 (&table_obstack
,
252 "#define yyerror %serror\n", spec_name_prefix
);
253 obstack_fgrow1 (&table_obstack
,
254 "#define yylval %slval\n", spec_name_prefix
);
255 obstack_fgrow1 (&table_obstack
,
256 "#define yychar %schar\n", spec_name_prefix
);
257 obstack_fgrow1 (&table_obstack
,
258 "#define yydebug %sdebug\n", spec_name_prefix
);
259 obstack_fgrow1 (&table_obstack
,
260 "#define yynerrs %snerrs\n", spec_name_prefix
);
265 /*-------------------------------------------------------.
266 | Output constant strings to the ends of certain files. |
267 `-------------------------------------------------------*/
270 output_trailers (void)
273 fprintf (fguard
, "\n }\n}\n");
275 obstack_1grow (&action_obstack
, '\n');
281 obstack_grow_string (&action_obstack
, " }\n");
283 obstack_grow_string (&action_obstack
, "}\n");
289 output_token_translations (void)
291 obstack_grow_string (&table_obstack
, "\
293 /* YYRANSLATE(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 "YYRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX",
305 ntokens
< 127 ? "char" : "short",
306 "yytranslate", token_translations
,
307 0, 1, max_user_token_number
+ 1);
311 obstack_grow_string (&table_obstack
,
312 "\n#define YYTRANSLATE(x) (x)\n");
320 /* With the ordinary parser,
321 yyprhs and yyrhs are needed only for yydebug. */
322 /* With the no_parser option, all tables are generated */
323 if (!semantic_parser
&& !no_parser_flag
)
324 obstack_grow_string (&table_obstack
, "\n#if YYDEBUG != 0\n");
326 output_short_table (&table_obstack
, NULL
, "yyprhs", rrhs
,
330 size_t yyrhs_size
= 1;
334 for (sp
= ritem
+ 1; *sp
; sp
++)
336 yyrhs
= XMALLOC (short, yyrhs_size
);
338 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
339 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
341 output_short_table (&table_obstack
, NULL
, "yyrhs", yyrhs
,
342 ritem
[0], 1, yyrhs_size
);
346 if (!semantic_parser
&& !no_parser_flag
)
347 obstack_grow_string (&table_obstack
, "\n#endif\n");
354 output_short_table (&table_obstack
, NULL
, "yystos", accessing_symbol
,
360 output_rule_data (void)
364 short *short_tab
= NULL
;
366 obstack_grow_string (&table_obstack
, "\n\
367 #if YYDEBUG != 0\n");
369 output_short_table (&table_obstack
,
370 "YYRLINE[YYN] -- source line where rule number YYN was defined",
374 obstack_grow_string (&table_obstack
, "#endif\n\n");
376 if (token_table_flag
|| no_parser_flag
)
378 obstack_fgrow1 (&table_obstack
, "#define YYNTOKENS %d\n", ntokens
);
379 obstack_fgrow1 (&table_obstack
, "#define YYNNTS %d\n", nvars
);
380 obstack_fgrow1 (&table_obstack
, "#define YYNRULES %d\n", nrules
);
381 obstack_fgrow1 (&table_obstack
, "#define YYNSTATES %d\n", nstates
);
382 obstack_fgrow1 (&table_obstack
, "#define YYMAXUTOK %d\n\n",
383 max_user_token_number
);
386 /* Output the table of symbol names. */
387 if (!token_table_flag
&& !no_parser_flag
)
388 obstack_grow_string (&table_obstack
,
389 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
390 obstack_grow_string (&table_obstack
, "\
391 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
392 obstack_grow_string (&table_obstack
,
393 "static const char *const yytname[] =\n{\n ");
396 for (i
= 0; i
< nsyms
; i
++)
397 /* this used to be i<=nsyms, but that output a final "" symbol
398 almost by accident */
400 /* Width of the next token, including the two quotes, the coma
405 for (p
= tags
[i
]; p
&& *p
; p
++)
406 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
409 else if (*p
< 040 || *p
>= 0177)
414 if (j
+ strsize
> 75)
416 obstack_grow_string (&table_obstack
, "\n ");
420 obstack_1grow (&table_obstack
, '\"');
421 for (p
= tags
[i
]; p
&& *p
; p
++)
423 if (*p
== '"' || *p
== '\\')
424 obstack_fgrow1 (&table_obstack
, "\\%c", *p
);
426 obstack_grow_string (&table_obstack
, "\\n");
428 obstack_grow_string (&table_obstack
, "\\t");
430 obstack_grow_string (&table_obstack
, "\\b");
431 else if (*p
< 040 || *p
>= 0177)
432 obstack_fgrow1 (&table_obstack
, "\\%03o", *p
);
434 obstack_1grow (&table_obstack
, *p
);
437 obstack_grow_string (&table_obstack
, "\", ");
440 /* add a NULL entry to list of tokens */
441 obstack_grow_string (&table_obstack
, "NULL\n};\n");
443 if (!token_table_flag
&& !no_parser_flag
)
444 obstack_grow_string (&table_obstack
, "#endif\n\n");
446 /* Output YYTOKNUM. */
447 if (token_table_flag
)
449 output_short_table (&table_obstack
,
450 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
451 "yytoknum", user_toknums
,
456 output_short_table (&table_obstack
,
457 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
462 obstack_1grow (&table_obstack
, '\n');
465 short_tab
= XMALLOC (short, nrules
+ 1);
466 for (i
= 1; i
< nrules
; i
++)
467 short_tab
[i
] = rrhs
[i
+ 1] - rrhs
[i
] - 1;
468 short_tab
[nrules
] = nitems
- rrhs
[nrules
] - 1;
469 output_short_table (&table_obstack
,
470 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
473 obstack_1grow (&table_obstack
, '\n');
482 output_defines (void)
484 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
);
485 obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
);
486 obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
);
490 /*------------------------------------------------------------------.
491 | Decide what to do for each type of token if seen as the lookahead |
492 | token in specified state. The value returned is used as the |
493 | default action (yydefact) for the state. In addition, actrow is |
494 | filled with what to do for each kind of token, index by symbol |
495 | number, with zero meaning do the default action. The value |
496 | MINSHORT, a very negative number, means this situation is an |
497 | error. The parser recognizes this value specially. |
499 | This is where conflicts are resolved. The loop over lookahead |
500 | rules considered lower-numbered rules last, and the last rule |
501 | considered that likes a token gets to handle it. |
502 `------------------------------------------------------------------*/
505 action_row (int state
)
524 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
526 for (i
= 0; i
< ntokens
; i
++)
531 redp
= reduction_table
[state
];
539 /* loop over all the rules available here which require
541 m
= lookaheads
[state
];
542 n
= lookaheads
[state
+ 1];
544 for (i
= n
- 1; i
>= m
; i
--)
547 wordp
= LA
+ i
* tokensetsize
;
550 /* and find each token which the rule finds acceptable
552 for (j
= 0; j
< ntokens
; j
++)
554 /* and record this rule as the rule to use if that
570 shiftp
= shift_table
[state
];
572 /* Now see which tokens are allowed for shifts in this state. For
573 them, record the shift as the thing to do. So shift is preferred
580 for (i
= 0; i
< k
; i
++)
582 shift_state
= shiftp
->shifts
[i
];
586 symbol
= accessing_symbol
[shift_state
];
591 actrow
[symbol
] = shift_state
;
593 /* Do not use any default reduction if there is a shift for
595 if (symbol
== error_token_number
)
600 errp
= err_table
[state
];
602 /* See which tokens are an explicit error in this state (due to
603 %nonassoc). For them, record MINSHORT as the action. */
609 for (i
= 0; i
< k
; i
++)
611 symbol
= errp
->errs
[i
];
612 actrow
[symbol
] = MINSHORT
;
616 /* Now find the most common reduction and make it the default action
619 if (nreds
>= 1 && !nodefault
)
621 if (consistent
[state
])
622 default_rule
= redp
->rules
[0];
626 for (i
= m
; i
< n
; i
++)
631 for (j
= 0; j
< ntokens
; j
++)
633 if (actrow
[j
] == rule
)
644 /* actions which match the default are replaced with zero,
645 which means "use the default" */
649 for (j
= 0; j
< ntokens
; j
++)
651 if (actrow
[j
] == default_rule
)
655 default_rule
= -default_rule
;
660 /* If have no default rule, the default is an error.
661 So replace any action which says "error" with "use default". */
663 if (default_rule
== 0)
664 for (j
= 0; j
< ntokens
; j
++)
666 if (actrow
[j
] == MINSHORT
)
684 for (i
= 0; i
< ntokens
; i
++)
693 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
694 tos
[state
] = sp2
= XCALLOC (short, count
);
696 for (i
= 0; i
< ntokens
; i
++)
705 tally
[state
] = count
;
706 width
[state
] = sp1
[-1] - sp
[0] + 1;
710 /*------------------------------------------------------------------.
711 | Figure out the actions for the specified state, indexed by |
712 | lookahead token type. |
714 | The YYDEFACT table is output now. The detailed info is saved for |
715 | putting into YYTABLE later. |
716 `------------------------------------------------------------------*/
722 short *yydefact
= XCALLOC (short, nstates
);
724 actrow
= XCALLOC (short, ntokens
);
725 for (i
= 0; i
< nstates
; ++i
)
727 yydefact
[i
] = action_row (i
);
732 output_short_table (&table_obstack
,
733 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
734 doesn't specify something else to do. Zero means the default is an\n\
736 "yydefact", yydefact
,
737 yydefact
[0], 1, nstates
);
738 obstack_1grow (&table_obstack
, '\n');
746 shifts
*sp
, *sptmp
; /* JF derefrenced freed ptr */
750 for (sp
= first_shift
; sp
; sp
= sptmp
)
759 free_reductions (void)
761 reductions
*rp
, *rptmp
; /* JF fixed freed ptr */
763 XFREE (reduction_table
);
765 for (rp
= first_reduction
; rp
; rp
= rptmp
)
775 save_column (int symbol
, int default_state
)
784 short begin
= goto_map
[symbol
];
785 short end
= goto_map
[symbol
+ 1];
788 for (i
= begin
; i
< end
; i
++)
790 if (to_state
[i
] != default_state
)
797 symno
= symbol
- ntokens
+ nstates
;
799 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
800 tos
[symno
] = sp2
= XCALLOC (short, count
);
802 for (i
= begin
; i
< end
; i
++)
804 if (to_state
[i
] != default_state
)
806 *sp1
++ = from_state
[i
];
807 *sp2
++ = to_state
[i
];
811 tally
[symno
] = count
;
812 width
[symno
] = sp1
[-1] - sp
[0] + 1;
816 default_goto (int symbol
)
824 m
= goto_map
[symbol
];
825 n
= goto_map
[symbol
+ 1];
830 for (i
= 0; i
< nstates
; i
++)
833 for (i
= m
; i
< n
; i
++)
834 state_count
[to_state
[i
]]++;
839 for (i
= 0; i
< nstates
; i
++)
841 if (state_count
[i
] > max
)
843 max
= state_count
[i
];
848 return default_state
;
852 /*-------------------------------------------------------------------.
853 | Figure out what to do after reducing with each rule, depending on |
854 | the saved state from before the beginning of parsing the data that |
855 | matched this rule. |
857 | The YYDEFGOTO table is output now. The detailed info is saved for |
858 | putting into YYTABLE later. |
859 `-------------------------------------------------------------------*/
866 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
867 state_count
= XCALLOC (short, nstates
);
869 for (i
= ntokens
; i
< nsyms
; ++i
)
871 int default_state
= default_goto (i
);
872 save_column (i
, default_state
);
873 yydefgoto
[i
- ntokens
] = default_state
;
876 output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
,
877 yydefgoto
[0], 1, nsyms
- ntokens
);
884 /* The next few functions decide how to pack the actions and gotos
885 information into yytable. */
896 order
= XCALLOC (short, nvectors
);
899 for (i
= 0; i
< nvectors
; i
++)
907 while (j
>= 0 && (width
[order
[j
]] < w
))
910 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
913 for (k
= nentries
- 1; k
> j
; k
--)
914 order
[k
+ 1] = order
[k
];
924 matching_state (int vector
)
941 for (prev
= vector
- 1; prev
>= 0; prev
--)
944 if (width
[j
] != w
|| tally
[j
] != t
)
948 for (k
= 0; match
&& k
< t
; k
++)
950 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
963 pack_vector (int vector
)
982 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
986 for (k
= 0; ok
&& k
< t
; k
++)
990 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
996 for (k
= 0; ok
&& k
< vector
; k
++)
1004 for (k
= 0; k
< t
; k
++)
1008 check
[loc
] = from
[k
];
1011 while (table
[lowzero
] != 0)
1021 berror ("pack_vector");
1022 return 0; /* JF keep lint happy */
1033 base
= XCALLOC (short, nvectors
);
1034 pos
= XCALLOC (short, nentries
);
1035 table
= XCALLOC (short, MAXTABLE
);
1036 check
= XCALLOC (short, MAXTABLE
);
1041 for (i
= 0; i
< nvectors
; i
++)
1044 for (i
= 0; i
< MAXTABLE
; i
++)
1047 for (i
= 0; i
< nentries
; i
++)
1049 state
= matching_state (i
);
1052 place
= pack_vector (i
);
1054 place
= base
[state
];
1057 base
[order
[i
]] = place
;
1060 for (i
= 0; i
< nvectors
; i
++)
1073 /* the following functions output yytable, yycheck
1074 and the vectors whose elements index the portion starts */
1079 output_short_table (&table_obstack
, NULL
, "yypact", base
,
1080 base
[0], 1, nstates
);
1082 obstack_1grow (&table_obstack
, '\n');
1084 output_short_table (&table_obstack
, NULL
, "yypgoto", base
,
1085 base
[nstates
], nstates
+ 1, nvectors
);
1094 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
);
1095 output_short_table (&table_obstack
, NULL
, "yytable", table
,
1096 table
[0], 1, high
+ 1);
1104 output_short_table (&table_obstack
, NULL
, "yycheck", check
,
1105 check
[0], 1, high
+ 1);
1109 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1113 output_actions (void)
1115 nvectors
= nstates
+ nvars
;
1117 froms
= XCALLOC (short *, nvectors
);
1118 tos
= XCALLOC (short *, nvectors
);
1119 tally
= XCALLOC (short, nvectors
);
1120 width
= XCALLOC (short, nvectors
);
1128 XFREE (accessing_symbol
);
1131 XFREE (goto_map
+ ntokens
);
1137 obstack_1grow (&table_obstack
, '\n');
1140 obstack_1grow (&table_obstack
, '\n');
1144 /*------------------------------------------.
1145 | Copy the parser code into TABLE_OBSTACK. |
1146 `------------------------------------------*/
1149 output_parser (void)
1154 const char *skeleton
= NULL
;
1155 int actions_dumped
= 0;
1158 obstack_grow_string (&table_obstack
, "#define YYPURE 1\n\n");
1160 /* Loop over lines in the standard parser file. */
1161 if (semantic_parser
)
1162 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1164 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1165 fskel
= xfopen (skeleton
, "r");
1167 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1168 decimal integer constant. This specifies that the line number of
1169 the *following* line of input, in its original source file, was
1178 sync_line
, /* #line. */
1179 actions_line
/* %% actions. */
1181 enum line_type_e line_type
= regular_line
;
1185 /* Is this line special? */
1188 /* See if it's a `#line' line. */
1189 if ((c
= getc (fskel
)) == 'l')
1190 if ((c
= getc (fskel
)) == 'i')
1191 if ((c
= getc (fskel
)) == 'n')
1192 if ((c
= getc (fskel
)) == 'e')
1193 line_type
= sync_line
;
1195 obstack_grow_string (&table_obstack
, "#lin");
1197 obstack_grow_string (&table_obstack
, "#li");
1199 obstack_grow_string (&table_obstack
, "#l");
1201 obstack_grow_string (&table_obstack
, "#");
1205 /* See if it's a `%% actions' line. */
1206 if ((c
= getc (fskel
)) == '%')
1207 if ((c
= getc (fskel
)) == ' ')
1208 if ((c
= getc (fskel
)) == 'a')
1209 if ((c
= getc (fskel
)) == 'c')
1210 if ((c
= getc (fskel
)) == 't')
1211 if ((c
= getc (fskel
)) == 'i')
1212 if ((c
= getc (fskel
)) == 'o')
1213 if ((c
= getc (fskel
)) == 'n')
1214 if ((c
= getc (fskel
)) == 's')
1215 line_type
= actions_line
;
1217 obstack_grow_string (&table_obstack
, "%% action");
1219 obstack_grow_string (&table_obstack
, "%% actio");
1221 obstack_grow_string (&table_obstack
, "%% acti");
1223 obstack_grow_string (&table_obstack
, "%% act");
1225 obstack_grow_string (&table_obstack
, "%% ac");
1227 obstack_grow_string (&table_obstack
, "%% a");
1229 obstack_grow_string (&table_obstack
, "%% ");
1231 obstack_grow_string (&table_obstack
, "%%");
1233 obstack_grow_string (&table_obstack
, "%");
1240 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1241 line
, quotearg_style (c_quoting_style
, skeleton
));
1243 /* Skip the end of line. */
1244 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1250 size_t size
= obstack_object_size (&action_obstack
);
1253 assert (actions_dumped
== 1);
1254 obstack_grow (&table_obstack
,
1255 obstack_finish (&action_obstack
),
1259 /* Skip the end of line. */
1260 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1265 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1266 obstack_1grow (&table_obstack
, c
);
1271 obstack_1grow (&table_obstack
, c
);
1274 assert (actions_dumped
== 1);
1279 output_program (void)
1284 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1285 lineno
, quotearg_style (c_quoting_style
, infile
));
1287 while ((c
= getc (finput
)) != EOF
)
1288 obstack_1grow (&table_obstack
, c
);
1293 free_itemsets (void)
1297 XFREE (state_table
);
1299 for (cp
= first_state
; cp
; cp
= cptmp
)
1307 /*----------------------------------------------------------.
1308 | Output the parsing tables and the parser code to ftable. |
1309 `----------------------------------------------------------*/
1314 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1316 /* If using a simple parser the definition of YYSTYPE are put into
1318 if (!semantic_parser
)
1320 size_t size
= obstack_object_size (&attrs_obstack
);
1321 obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
);
1323 reader_output_yylsp (&table_obstack
);
1325 obstack_grow_string (&table_obstack
, "\
1327 # define YYDEBUG 1\n\
1331 if (semantic_parser
)
1332 obstack_fgrow1 (&table_obstack
, "#include %s\n",
1333 quotearg_style (c_quoting_style
, attrsfile
));
1335 if (!no_parser_flag
)
1336 obstack_grow_string (&table_obstack
, "#include <stdio.h>\n\n");
1338 /* Make "const" do nothing if not in ANSI C. */
1339 obstack_grow_string (&table_obstack
, "\
1340 #ifndef __cplusplus\n\
1341 # ifndef __STDC__\n\
1349 output_token_translations ();
1350 /* if (semantic_parser) */
1351 /* This is now unconditional because debugging printouts can use it. */
1354 if (semantic_parser
)
1356 output_rule_data ();
1358 if (!no_parser_flag
)