]>
git.saurik.com Git - bison.git/blob - src/output.c
adef04336fdf8812b71d4772c74b9e5c474f8d93
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_literal_string (oout
, "\n ");
161 obstack_fgrow1 (oout
, "%6d", short_table
[i
]);
164 obstack_grow_literal_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_literal_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_literal_string (&action_obstack
, " }\n");
283 obstack_grow_literal_string (&action_obstack
, "}\n");
289 output_token_translations (void)
291 obstack_grow_literal_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_literal_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_literal_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_literal_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_literal_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_literal_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_literal_string (&table_obstack
,
389 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
390 obstack_grow_literal_string (&table_obstack
, "\
391 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
392 obstack_grow_literal_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_literal_string (&table_obstack
, "\n ");
420 obstack_1grow (&table_obstack
, '\"');
421 for (p
= tags
[i
]; p
&& *p
; p
++)
423 if (*p
== '"' || *p
== '\\')
425 obstack_fgrow1 (&table_obstack
, "\\%c", *p
);
429 obstack_grow_literal_string (&table_obstack
, "\\n");
433 obstack_grow_literal_string (&table_obstack
, "\\t");
437 obstack_grow_literal_string (&table_obstack
, "\\b");
439 else if (*p
< 040 || *p
>= 0177)
441 obstack_fgrow1 (&table_obstack
, "\\%03o", *p
);
445 obstack_1grow (&table_obstack
, *p
);
449 obstack_grow_literal_string (&table_obstack
, "\", ");
452 /* add a NULL entry to list of tokens */
453 obstack_grow_literal_string (&table_obstack
, "NULL\n};\n");
455 if (!token_table_flag
&& !no_parser_flag
)
456 obstack_grow_literal_string (&table_obstack
, "#endif\n\n");
458 /* Output YYTOKNUM. */
459 if (token_table_flag
)
461 output_short_table (&table_obstack
,
462 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
463 "yytoknum", user_toknums
,
468 output_short_table (&table_obstack
,
469 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
474 obstack_1grow (&table_obstack
, '\n');
477 short_tab
= XMALLOC (short, nrules
+ 1);
478 for (i
= 1; i
< nrules
; i
++)
479 short_tab
[i
] = rrhs
[i
+ 1] - rrhs
[i
] - 1;
480 short_tab
[nrules
] = nitems
- rrhs
[nrules
] - 1;
481 output_short_table (&table_obstack
,
482 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
485 obstack_1grow (&table_obstack
, '\n');
494 output_defines (void)
496 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
);
497 obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
);
498 obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
);
502 /*------------------------------------------------------------------.
503 | Decide what to do for each type of token if seen as the lookahead |
504 | token in specified state. The value returned is used as the |
505 | default action (yydefact) for the state. In addition, actrow is |
506 | filled with what to do for each kind of token, index by symbol |
507 | number, with zero meaning do the default action. The value |
508 | MINSHORT, a very negative number, means this situation is an |
509 | error. The parser recognizes this value specially. |
511 | This is where conflicts are resolved. The loop over lookahead |
512 | rules considered lower-numbered rules last, and the last rule |
513 | considered that likes a token gets to handle it. |
514 `------------------------------------------------------------------*/
517 action_row (int state
)
536 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
538 for (i
= 0; i
< ntokens
; i
++)
543 redp
= reduction_table
[state
];
551 /* loop over all the rules available here which require
553 m
= lookaheads
[state
];
554 n
= lookaheads
[state
+ 1];
556 for (i
= n
- 1; i
>= m
; i
--)
559 wordp
= LA
+ i
* tokensetsize
;
562 /* and find each token which the rule finds acceptable
564 for (j
= 0; j
< ntokens
; j
++)
566 /* and record this rule as the rule to use if that
582 shiftp
= shift_table
[state
];
584 /* Now see which tokens are allowed for shifts in this state. For
585 them, record the shift as the thing to do. So shift is preferred
592 for (i
= 0; i
< k
; i
++)
594 shift_state
= shiftp
->shifts
[i
];
598 symbol
= accessing_symbol
[shift_state
];
603 actrow
[symbol
] = shift_state
;
605 /* Do not use any default reduction if there is a shift for
607 if (symbol
== error_token_number
)
612 errp
= err_table
[state
];
614 /* See which tokens are an explicit error in this state (due to
615 %nonassoc). For them, record MINSHORT as the action. */
621 for (i
= 0; i
< k
; i
++)
623 symbol
= errp
->errs
[i
];
624 actrow
[symbol
] = MINSHORT
;
628 /* Now find the most common reduction and make it the default action
631 if (nreds
>= 1 && !nodefault
)
633 if (consistent
[state
])
634 default_rule
= redp
->rules
[0];
638 for (i
= m
; i
< n
; i
++)
643 for (j
= 0; j
< ntokens
; j
++)
645 if (actrow
[j
] == rule
)
656 /* actions which match the default are replaced with zero,
657 which means "use the default" */
661 for (j
= 0; j
< ntokens
; j
++)
663 if (actrow
[j
] == default_rule
)
667 default_rule
= -default_rule
;
672 /* If have no default rule, the default is an error.
673 So replace any action which says "error" with "use default". */
675 if (default_rule
== 0)
676 for (j
= 0; j
< ntokens
; j
++)
678 if (actrow
[j
] == MINSHORT
)
696 for (i
= 0; i
< ntokens
; i
++)
705 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
706 tos
[state
] = sp2
= XCALLOC (short, count
);
708 for (i
= 0; i
< ntokens
; i
++)
717 tally
[state
] = count
;
718 width
[state
] = sp1
[-1] - sp
[0] + 1;
722 /*------------------------------------------------------------------.
723 | Figure out the actions for the specified state, indexed by |
724 | lookahead token type. |
726 | The YYDEFACT table is output now. The detailed info is saved for |
727 | putting into YYTABLE later. |
728 `------------------------------------------------------------------*/
734 short *yydefact
= XCALLOC (short, nstates
);
736 actrow
= XCALLOC (short, ntokens
);
737 for (i
= 0; i
< nstates
; ++i
)
739 yydefact
[i
] = action_row (i
);
744 output_short_table (&table_obstack
,
745 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
746 doesn't specify something else to do. Zero means the default is an\n\
748 "yydefact", yydefact
,
749 yydefact
[0], 1, nstates
);
750 obstack_1grow (&table_obstack
, '\n');
758 shifts
*sp
, *sptmp
; /* JF derefrenced freed ptr */
762 for (sp
= first_shift
; sp
; sp
= sptmp
)
771 free_reductions (void)
773 reductions
*rp
, *rptmp
; /* JF fixed freed ptr */
775 XFREE (reduction_table
);
777 for (rp
= first_reduction
; rp
; rp
= rptmp
)
787 save_column (int symbol
, int default_state
)
796 short begin
= goto_map
[symbol
];
797 short end
= goto_map
[symbol
+ 1];
800 for (i
= begin
; i
< end
; i
++)
802 if (to_state
[i
] != default_state
)
809 symno
= symbol
- ntokens
+ nstates
;
811 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
812 tos
[symno
] = sp2
= XCALLOC (short, count
);
814 for (i
= begin
; i
< end
; i
++)
816 if (to_state
[i
] != default_state
)
818 *sp1
++ = from_state
[i
];
819 *sp2
++ = to_state
[i
];
823 tally
[symno
] = count
;
824 width
[symno
] = sp1
[-1] - sp
[0] + 1;
828 default_goto (int symbol
)
836 m
= goto_map
[symbol
];
837 n
= goto_map
[symbol
+ 1];
842 for (i
= 0; i
< nstates
; i
++)
845 for (i
= m
; i
< n
; i
++)
846 state_count
[to_state
[i
]]++;
851 for (i
= 0; i
< nstates
; i
++)
853 if (state_count
[i
] > max
)
855 max
= state_count
[i
];
860 return default_state
;
864 /*-------------------------------------------------------------------.
865 | Figure out what to do after reducing with each rule, depending on |
866 | the saved state from before the beginning of parsing the data that |
867 | matched this rule. |
869 | The YYDEFGOTO table is output now. The detailed info is saved for |
870 | putting into YYTABLE later. |
871 `-------------------------------------------------------------------*/
878 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
879 state_count
= XCALLOC (short, nstates
);
881 for (i
= ntokens
; i
< nsyms
; ++i
)
883 int default_state
= default_goto (i
);
884 save_column (i
, default_state
);
885 yydefgoto
[i
- ntokens
] = default_state
;
888 output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
,
889 yydefgoto
[0], 1, nsyms
- ntokens
);
896 /* The next few functions decide how to pack the actions and gotos
897 information into yytable. */
908 order
= XCALLOC (short, nvectors
);
911 for (i
= 0; i
< nvectors
; i
++)
919 while (j
>= 0 && (width
[order
[j
]] < w
))
922 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
925 for (k
= nentries
- 1; k
> j
; k
--)
926 order
[k
+ 1] = order
[k
];
936 matching_state (int vector
)
953 for (prev
= vector
- 1; prev
>= 0; prev
--)
956 if (width
[j
] != w
|| tally
[j
] != t
)
960 for (k
= 0; match
&& k
< t
; k
++)
962 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
975 pack_vector (int vector
)
994 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
998 for (k
= 0; ok
&& k
< t
; k
++)
1002 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
1004 if (table
[loc
] != 0)
1008 for (k
= 0; ok
&& k
< vector
; k
++)
1016 for (k
= 0; k
< t
; k
++)
1020 check
[loc
] = from
[k
];
1023 while (table
[lowzero
] != 0)
1033 berror ("pack_vector");
1034 return 0; /* JF keep lint happy */
1045 base
= XCALLOC (short, nvectors
);
1046 pos
= XCALLOC (short, nentries
);
1047 table
= XCALLOC (short, MAXTABLE
);
1048 check
= XCALLOC (short, MAXTABLE
);
1053 for (i
= 0; i
< nvectors
; i
++)
1056 for (i
= 0; i
< MAXTABLE
; i
++)
1059 for (i
= 0; i
< nentries
; i
++)
1061 state
= matching_state (i
);
1064 place
= pack_vector (i
);
1066 place
= base
[state
];
1069 base
[order
[i
]] = place
;
1072 for (i
= 0; i
< nvectors
; i
++)
1085 /* the following functions output yytable, yycheck
1086 and the vectors whose elements index the portion starts */
1091 output_short_table (&table_obstack
, NULL
, "yypact", base
,
1092 base
[0], 1, nstates
);
1094 obstack_1grow (&table_obstack
, '\n');
1096 output_short_table (&table_obstack
, NULL
, "yypgoto", base
,
1097 base
[nstates
], nstates
+ 1, nvectors
);
1106 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
);
1107 output_short_table (&table_obstack
, NULL
, "yytable", table
,
1108 table
[0], 1, high
+ 1);
1116 output_short_table (&table_obstack
, NULL
, "yycheck", check
,
1117 check
[0], 1, high
+ 1);
1121 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1125 output_actions (void)
1127 nvectors
= nstates
+ nvars
;
1129 froms
= XCALLOC (short *, nvectors
);
1130 tos
= XCALLOC (short *, nvectors
);
1131 tally
= XCALLOC (short, nvectors
);
1132 width
= XCALLOC (short, nvectors
);
1140 XFREE (accessing_symbol
);
1143 XFREE (goto_map
+ ntokens
);
1149 obstack_1grow (&table_obstack
, '\n');
1152 obstack_1grow (&table_obstack
, '\n');
1156 /*------------------------------------------.
1157 | Copy the parser code into TABLE_OBSTACK. |
1158 `------------------------------------------*/
1161 output_parser (void)
1166 const char *skeleton
= NULL
;
1167 int number_of_dollar_signs
= 0;
1170 obstack_grow_literal_string (&table_obstack
, "#define YYPURE 1\n\n");
1172 /* Loop over lines in the standard parser file. */
1173 if (semantic_parser
)
1174 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1176 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1177 fskel
= xfopen (skeleton
, "r");
1179 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1180 decimal integer constant. This specifies that the line number of
1181 the *following* line of input, in its original source file, was
1187 int is_sync_line
= 0;
1192 /* See if the line starts with `#line'. */
1194 if ((c
= getc (fskel
)) == 'l')
1195 if ((c
= getc (fskel
)) == 'i')
1196 if ((c
= getc (fskel
)) == 'n')
1197 if ((c
= getc (fskel
)) == 'e')
1200 obstack_grow_literal_string (&table_obstack
, "#lin");
1202 obstack_grow_literal_string (&table_obstack
, "#li");
1204 obstack_grow_literal_string (&table_obstack
, "#l");
1206 obstack_grow_literal_string (&table_obstack
, "#");
1208 /* If was a `#line' line, either compute it, or drop it. */
1209 if (is_sync_line
&& !no_lines_flag
)
1210 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1211 line
, quotearg_style (c_quoting_style
, skeleton
));
1216 /* now write out the line... */
1217 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1220 /* `$' in the parser file indicates where to put the
1221 actions. Copy them in at this point. */
1224 size_t size
= obstack_object_size (&action_obstack
);
1226 number_of_dollar_signs
++;
1227 assert (number_of_dollar_signs
== 1);
1228 obstack_grow (&table_obstack
,
1229 obstack_finish (&action_obstack
),
1232 /* Skip the end of the line containing `$'. */
1236 obstack_1grow (&table_obstack
, c
);
1240 obstack_1grow (&table_obstack
, c
);
1243 assert (number_of_dollar_signs
== 1);
1248 output_program (void)
1253 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1254 lineno
, quotearg_style (c_quoting_style
, infile
));
1256 while ((c
= getc (finput
)) != EOF
)
1257 obstack_1grow (&table_obstack
, c
);
1262 free_itemsets (void)
1266 XFREE (state_table
);
1268 for (cp
= first_state
; cp
; cp
= cptmp
)
1276 /*----------------------------------------------------------.
1277 | Output the parsing tables and the parser code to ftable. |
1278 `----------------------------------------------------------*/
1283 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1285 /* If using a simple parser the definition of YYSTYPE are put into
1287 if (!semantic_parser
)
1289 size_t size
= obstack_object_size (&attrs_obstack
);
1290 obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
);
1292 reader_output_yylsp (&table_obstack
);
1294 obstack_grow_literal_string (&table_obstack
, "\
1296 # define YYDEBUG 1\n\
1300 if (semantic_parser
)
1301 obstack_fgrow1 (&table_obstack
, "#include %s\n",
1302 quotearg_style (c_quoting_style
, attrsfile
));
1304 if (!no_parser_flag
)
1305 obstack_grow_literal_string (&table_obstack
, "#include <stdio.h>\n\n");
1307 /* Make "const" do nothing if not in ANSI C. */
1308 obstack_grow_literal_string (&table_obstack
, "\
1309 #ifndef __cplusplus\n\
1310 # ifndef __STDC__\n\
1318 output_token_translations ();
1319 /* if (semantic_parser) */
1320 /* This is now unconditional because debugging printouts can use it. */
1323 if (semantic_parser
)
1325 output_rule_data ();
1327 if (!no_parser_flag
)