]>
git.saurik.com Git - bison.git/blob - src/output.c
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");
324 short *values
= XCALLOC (short, nrules
+ 1);
325 for (i
= 0; i
< nrules
+ 1; ++i
)
326 values
[i
] = rule_table
[i
].rhs
;
327 output_short_table (&table_obstack
, NULL
, "yyprhs", values
,
333 size_t yyrhs_size
= 1;
337 for (sp
= ritem
+ 1; *sp
; sp
++)
339 yyrhs
= XMALLOC (short, yyrhs_size
);
341 for (sp
= ritem
+ 1, i
= 1; *sp
; ++sp
, ++i
)
342 yyrhs
[i
] = *sp
> 0 ? *sp
: 0;
344 output_short_table (&table_obstack
, NULL
, "yyrhs", yyrhs
,
345 ritem
[0], 1, yyrhs_size
);
349 if (!semantic_parser
&& !no_parser_flag
)
350 obstack_sgrow (&table_obstack
, "\n#endif\n");
358 short *values
= (short *) alloca (sizeof (short) * nstates
);
359 for (i
= 0; i
< nstates
; ++i
)
360 values
[i
] = state_table
[i
].accessing_symbol
;
361 output_short_table (&table_obstack
,
362 "YYSTOS[STATE] -- Accessing symbol to the STATE",
369 output_rule_data (void)
373 short *short_tab
= NULL
;
375 obstack_sgrow (&table_obstack
, "\n\
376 #if YYDEBUG != 0\n");
378 output_short_table (&table_obstack
,
379 "YYRLINE[YYN] -- source line where rule number YYN was defined",
383 obstack_sgrow (&table_obstack
, "#endif\n\n");
385 if (token_table_flag
|| no_parser_flag
)
387 obstack_fgrow1 (&table_obstack
, "#define YYNTOKENS %d\n", ntokens
);
388 obstack_fgrow1 (&table_obstack
, "#define YYNNTS %d\n", nvars
);
389 obstack_fgrow1 (&table_obstack
, "#define YYNRULES %d\n", nrules
);
390 obstack_fgrow1 (&table_obstack
, "#define YYNSTATES %d\n", nstates
);
391 obstack_fgrow1 (&table_obstack
, "#define YYMAXUTOK %d\n\n",
392 max_user_token_number
);
395 /* Output the table of symbol names. */
396 if (!token_table_flag
&& !no_parser_flag
)
397 obstack_sgrow (&table_obstack
,
398 "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n");
399 obstack_sgrow (&table_obstack
, "\
400 /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n");
401 obstack_sgrow (&table_obstack
,
402 "static const char *const yytname[] =\n{\n ");
405 for (i
= 0; i
< nsyms
; i
++)
406 /* this used to be i<=nsyms, but that output a final "" symbol
407 almost by accident */
409 /* Width of the next token, including the two quotes, the coma
414 for (p
= tags
[i
]; p
&& *p
; p
++)
415 if (*p
== '"' || *p
== '\\' || *p
== '\n' || *p
== '\t'
418 else if (*p
< 040 || *p
>= 0177)
423 if (j
+ strsize
> 75)
425 obstack_sgrow (&table_obstack
, "\n ");
429 obstack_1grow (&table_obstack
, '\"');
430 for (p
= tags
[i
]; p
&& *p
; p
++)
432 if (*p
== '"' || *p
== '\\')
433 obstack_fgrow1 (&table_obstack
, "\\%c", *p
);
435 obstack_sgrow (&table_obstack
, "\\n");
437 obstack_sgrow (&table_obstack
, "\\t");
439 obstack_sgrow (&table_obstack
, "\\b");
440 else if (*p
< 040 || *p
>= 0177)
441 obstack_fgrow1 (&table_obstack
, "\\%03o", *p
);
443 obstack_1grow (&table_obstack
, *p
);
446 obstack_sgrow (&table_obstack
, "\", ");
449 /* add a NULL entry to list of tokens */
450 obstack_sgrow (&table_obstack
, "NULL\n};\n");
452 if (!token_table_flag
&& !no_parser_flag
)
453 obstack_sgrow (&table_obstack
, "#endif\n\n");
455 /* Output YYTOKNUM. */
456 if (token_table_flag
)
458 output_short_table (&table_obstack
,
459 "YYTOKNUM[YYLEX] -- Index in YYTNAME corresponding to YYLEX",
460 "yytoknum", user_toknums
,
466 short *values
= XCALLOC (short, nrules
+ 1);
467 for (i
= 0; i
< nrules
+ 1; ++i
)
468 values
[i
] = rule_table
[i
].lhs
;
469 output_short_table (&table_obstack
,
470 "YYR1[YYN] -- Symbol number of symbol that rule YYN derives",
476 obstack_1grow (&table_obstack
, '\n');
479 short_tab
= XMALLOC (short, nrules
+ 1);
480 for (i
= 1; i
< nrules
; i
++)
481 short_tab
[i
] = rule_table
[i
+ 1].rhs
- rule_table
[i
].rhs
- 1;
482 short_tab
[nrules
] = nitems
- rule_table
[nrules
].rhs
- 1;
483 output_short_table (&table_obstack
,
484 "YYR2[YYN] -- Number of symbols composing right hand side of rule YYN",
487 obstack_1grow (&table_obstack
, '\n');
491 XFREE (rule_table
+ 1);
496 output_defines (void)
498 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYFINAL\t\t%d\n", final_state
);
499 obstack_fgrow1 (&table_obstack
, "#define\tYYFLAG\t\t%d\n", MINSHORT
);
500 obstack_fgrow1 (&table_obstack
, "#define\tYYNTBASE\t%d\n", ntokens
);
504 /*------------------------------------------------------------------.
505 | Decide what to do for each type of token if seen as the lookahead |
506 | token in specified state. The value returned is used as the |
507 | default action (yydefact) for the state. In addition, actrow is |
508 | filled with what to do for each kind of token, index by symbol |
509 | number, with zero meaning do the default action. The value |
510 | MINSHORT, a very negative number, means this situation is an |
511 | error. The parser recognizes this value specially. |
513 | This is where conflicts are resolved. The loop over lookahead |
514 | rules considered lower-numbered rules last, and the last rule |
515 | considered that likes a token gets to handle it. |
516 `------------------------------------------------------------------*/
519 action_row (int state
)
538 int nodefault
= 0; /* set nonzero to inhibit having any default reduction */
540 for (i
= 0; i
< ntokens
; i
++)
545 redp
= state_table
[state
].reduction_table
;
553 /* loop over all the rules available here which require
555 m
= state_table
[state
].lookaheads
;
556 n
= state_table
[state
+ 1].lookaheads
;
558 for (i
= n
- 1; i
>= m
; i
--)
564 /* and find each token which the rule finds acceptable
566 for (j
= 0; j
< ntokens
; j
++)
568 /* and record this rule as the rule to use if that
584 shiftp
= state_table
[state
].shift_table
;
586 /* Now see which tokens are allowed for shifts in this state. For
587 them, record the shift as the thing to do. So shift is preferred
594 for (i
= 0; i
< k
; i
++)
596 shift_state
= shiftp
->shifts
[i
];
600 symbol
= state_table
[shift_state
].accessing_symbol
;
605 actrow
[symbol
] = shift_state
;
607 /* Do not use any default reduction if there is a shift for
609 if (symbol
== error_token_number
)
614 errp
= err_table
[state
];
616 /* See which tokens are an explicit error in this state (due to
617 %nonassoc). For them, record MINSHORT as the action. */
623 for (i
= 0; i
< k
; i
++)
625 symbol
= errp
->errs
[i
];
626 actrow
[symbol
] = MINSHORT
;
630 /* Now find the most common reduction and make it the default action
633 if (nreds
>= 1 && !nodefault
)
635 if (state_table
[state
].consistent
)
636 default_rule
= redp
->rules
[0];
640 for (i
= m
; i
< n
; i
++)
645 for (j
= 0; j
< ntokens
; j
++)
647 if (actrow
[j
] == rule
)
658 /* actions which match the default are replaced with zero,
659 which means "use the default" */
663 for (j
= 0; j
< ntokens
; j
++)
665 if (actrow
[j
] == default_rule
)
669 default_rule
= -default_rule
;
674 /* If have no default rule, the default is an error.
675 So replace any action which says "error" with "use default". */
677 if (default_rule
== 0)
678 for (j
= 0; j
< ntokens
; j
++)
680 if (actrow
[j
] == MINSHORT
)
698 for (i
= 0; i
< ntokens
; i
++)
707 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
708 tos
[state
] = sp2
= XCALLOC (short, count
);
710 for (i
= 0; i
< ntokens
; i
++)
719 tally
[state
] = count
;
720 width
[state
] = sp1
[-1] - sp
[0] + 1;
724 /*------------------------------------------------------------------.
725 | Figure out the actions for the specified state, indexed by |
726 | lookahead token type. |
728 | The YYDEFACT table is output now. The detailed info is saved for |
729 | putting into YYTABLE later. |
730 `------------------------------------------------------------------*/
736 short *yydefact
= XCALLOC (short, nstates
);
738 actrow
= XCALLOC (short, ntokens
);
739 for (i
= 0; i
< nstates
; ++i
)
741 yydefact
[i
] = action_row (i
);
746 output_short_table (&table_obstack
,
747 "YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n\
748 doesn't specify something else to do. Zero means the default is an\n\
750 "yydefact", yydefact
,
751 yydefact
[0], 1, nstates
);
752 obstack_1grow (&table_obstack
, '\n');
760 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 for (rp
= first_reduction
; rp
; rp
= rptmp
)
785 save_column (int symbol
, int default_state
)
794 short begin
= goto_map
[symbol
];
795 short end
= goto_map
[symbol
+ 1];
798 for (i
= begin
; i
< end
; i
++)
800 if (to_state
[i
] != default_state
)
807 symno
= symbol
- ntokens
+ nstates
;
809 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
810 tos
[symno
] = sp2
= XCALLOC (short, count
);
812 for (i
= begin
; i
< end
; i
++)
814 if (to_state
[i
] != default_state
)
816 *sp1
++ = from_state
[i
];
817 *sp2
++ = to_state
[i
];
821 tally
[symno
] = count
;
822 width
[symno
] = sp1
[-1] - sp
[0] + 1;
826 default_goto (int symbol
)
834 m
= goto_map
[symbol
];
835 n
= goto_map
[symbol
+ 1];
840 for (i
= 0; i
< nstates
; i
++)
843 for (i
= m
; i
< n
; i
++)
844 state_count
[to_state
[i
]]++;
849 for (i
= 0; i
< nstates
; i
++)
851 if (state_count
[i
] > max
)
853 max
= state_count
[i
];
858 return default_state
;
862 /*-------------------------------------------------------------------.
863 | Figure out what to do after reducing with each rule, depending on |
864 | the saved state from before the beginning of parsing the data that |
865 | matched this rule. |
867 | The YYDEFGOTO table is output now. The detailed info is saved for |
868 | putting into YYTABLE later. |
869 `-------------------------------------------------------------------*/
876 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
877 state_count
= XCALLOC (short, nstates
);
879 for (i
= ntokens
; i
< nsyms
; ++i
)
881 int default_state
= default_goto (i
);
882 save_column (i
, default_state
);
883 yydefgoto
[i
- ntokens
] = default_state
;
886 output_short_table (&table_obstack
, NULL
, "yydefgoto", yydefgoto
,
887 yydefgoto
[0], 1, nsyms
- ntokens
);
894 /* The next few functions decide how to pack the actions and gotos
895 information into yytable. */
906 order
= XCALLOC (short, nvectors
);
909 for (i
= 0; i
< nvectors
; i
++)
917 while (j
>= 0 && (width
[order
[j
]] < w
))
920 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
923 for (k
= nentries
- 1; k
> j
; k
--)
924 order
[k
+ 1] = order
[k
];
934 matching_state (int vector
)
951 for (prev
= vector
- 1; prev
>= 0; prev
--)
954 if (width
[j
] != w
|| tally
[j
] != t
)
958 for (k
= 0; match
&& k
< t
; k
++)
960 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
973 pack_vector (int vector
)
992 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
996 for (k
= 0; ok
&& k
< t
; k
++)
1000 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
1002 if (table
[loc
] != 0)
1006 for (k
= 0; ok
&& k
< vector
; k
++)
1014 for (k
= 0; k
< t
; k
++)
1018 check
[loc
] = from
[k
];
1021 while (table
[lowzero
] != 0)
1031 berror ("pack_vector");
1032 return 0; /* JF keep lint happy */
1043 base
= XCALLOC (short, nvectors
);
1044 pos
= XCALLOC (short, nentries
);
1045 table
= XCALLOC (short, MAXTABLE
);
1046 check
= XCALLOC (short, MAXTABLE
);
1051 for (i
= 0; i
< nvectors
; i
++)
1054 for (i
= 0; i
< MAXTABLE
; i
++)
1057 for (i
= 0; i
< nentries
; i
++)
1059 state
= matching_state (i
);
1062 place
= pack_vector (i
);
1064 place
= base
[state
];
1067 base
[order
[i
]] = place
;
1070 for (i
= 0; i
< nvectors
; i
++)
1083 /* the following functions output yytable, yycheck
1084 and the vectors whose elements index the portion starts */
1089 output_short_table (&table_obstack
, NULL
, "yypact", base
,
1090 base
[0], 1, nstates
);
1092 obstack_1grow (&table_obstack
, '\n');
1094 output_short_table (&table_obstack
, NULL
, "yypgoto", base
,
1095 base
[nstates
], nstates
+ 1, nvectors
);
1104 obstack_fgrow1 (&table_obstack
, "\n\n#define\tYYLAST\t\t%d\n\n\n", high
);
1105 output_short_table (&table_obstack
, NULL
, "yytable", table
,
1106 table
[0], 1, high
+ 1);
1114 output_short_table (&table_obstack
, NULL
, "yycheck", check
,
1115 check
[0], 1, high
+ 1);
1119 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
1123 output_actions (void)
1125 nvectors
= nstates
+ nvars
;
1127 froms
= XCALLOC (short *, nvectors
);
1128 tos
= XCALLOC (short *, nvectors
);
1129 tally
= XCALLOC (short, nvectors
);
1130 width
= XCALLOC (short, nvectors
);
1139 XFREE (goto_map
+ ntokens
);
1145 obstack_1grow (&table_obstack
, '\n');
1148 obstack_1grow (&table_obstack
, '\n');
1152 /*------------------------------------------.
1153 | Copy the parser code into TABLE_OBSTACK. |
1154 `------------------------------------------*/
1157 output_parser (void)
1162 int actions_dumped
= 0;
1165 obstack_sgrow (&table_obstack
, "#define YYPURE 1\n\n");
1167 /* Loop over lines in the standard parser file. */
1170 if (semantic_parser
)
1171 skeleton
= skeleton_find ("BISON_HAIRY", BISON_HAIRY
);
1173 skeleton
= skeleton_find ("BISON_SIMPLE", BISON_SIMPLE
);
1176 fskel
= xfopen (skeleton
, "r");
1178 /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a
1179 decimal integer constant. This specifies that the line number of
1180 the *following* line of input, in its original source file, was
1189 sync_line
, /* #line. */
1190 actions_line
/* %% actions. */
1192 enum line_type_e line_type
= regular_line
;
1196 /* Is this line special? */
1199 /* See if it's a `#line' line. */
1200 if ((c
= getc (fskel
)) == 'l')
1201 if ((c
= getc (fskel
)) == 'i')
1202 if ((c
= getc (fskel
)) == 'n')
1203 if ((c
= getc (fskel
)) == 'e')
1204 line_type
= sync_line
;
1206 obstack_sgrow (&table_obstack
, "#lin");
1208 obstack_sgrow (&table_obstack
, "#li");
1210 obstack_sgrow (&table_obstack
, "#l");
1212 obstack_sgrow (&table_obstack
, "#");
1216 /* See if it's a `%% actions' line. */
1217 if ((c
= getc (fskel
)) == '%')
1218 if ((c
= getc (fskel
)) == ' ')
1219 if ((c
= getc (fskel
)) == 'a')
1220 if ((c
= getc (fskel
)) == 'c')
1221 if ((c
= getc (fskel
)) == 't')
1222 if ((c
= getc (fskel
)) == 'i')
1223 if ((c
= getc (fskel
)) == 'o')
1224 if ((c
= getc (fskel
)) == 'n')
1225 if ((c
= getc (fskel
)) == 's')
1226 line_type
= actions_line
;
1228 obstack_sgrow (&table_obstack
, "%% action");
1230 obstack_sgrow (&table_obstack
, "%% actio");
1232 obstack_sgrow (&table_obstack
, "%% acti");
1234 obstack_sgrow (&table_obstack
, "%% act");
1236 obstack_sgrow (&table_obstack
, "%% ac");
1238 obstack_sgrow (&table_obstack
, "%% a");
1240 obstack_sgrow (&table_obstack
, "%% ");
1242 obstack_sgrow (&table_obstack
, "%%");
1244 obstack_sgrow (&table_obstack
, "%");
1251 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1252 line
, quotearg_style (c_quoting_style
, skeleton
));
1254 /* Skip the end of line. */
1255 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1261 size_t size
= obstack_object_size (&action_obstack
);
1264 assert (actions_dumped
== 1);
1265 obstack_grow (&table_obstack
,
1266 obstack_finish (&action_obstack
),
1270 /* Skip the end of line. */
1271 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1276 for (; c
!= '\n' && c
!= EOF
; c
= getc (fskel
))
1277 obstack_1grow (&table_obstack
, c
);
1282 obstack_1grow (&table_obstack
, c
);
1285 assert (actions_dumped
== 1);
1290 output_program (void)
1295 obstack_fgrow2 (&table_obstack
, "#line %d %s\n",
1296 lineno
, quotearg_style (c_quoting_style
, infile
));
1298 while ((c
= getc (finput
)) != EOF
)
1299 obstack_1grow (&table_obstack
, c
);
1304 free_itemsets (void)
1307 for (cp
= first_state
; cp
; cp
= cptmp
)
1315 /*----------------------------------------------------------.
1316 | Output the parsing tables and the parser code to ftable. |
1317 `----------------------------------------------------------*/
1322 /* output_token_defines(ftable); / * JF put out token defines FIRST */
1324 /* If using a simple parser the definition of YYSTYPE are put into
1326 if (!semantic_parser
)
1328 size_t size
= obstack_object_size (&attrs_obstack
);
1329 obstack_grow (&table_obstack
, obstack_finish (&attrs_obstack
), size
);
1331 reader_output_yylsp (&table_obstack
);
1333 obstack_sgrow (&table_obstack
, "\
1335 # define YYDEBUG 1\n\
1339 if (semantic_parser
)
1340 obstack_fgrow1 (&table_obstack
, "#include %s\n",
1341 quotearg_style (c_quoting_style
, attrsfile
));
1343 if (!no_parser_flag
)
1344 obstack_sgrow (&table_obstack
, "#include <stdio.h>\n\n");
1348 output_token_translations ();
1349 /* if (semantic_parser) */
1350 /* This is now unconditional because debugging printouts can use it. */
1353 if (semantic_parser
)
1355 output_rule_data ();
1357 XFREE (state_table
);
1359 if (!no_parser_flag
)