]>
git.saurik.com Git - bison.git/blob - src/output.c
1 /* Output the generated parsing program for bison,
2 Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002
3 Free Software Foundation, Inc.
5 This file is part of Bison, the GNU Compiler Compiler.
7 Bison is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 Bison is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bison; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 /* The parser tables consist of these tables. Marked ones needed only
24 for the semantic parser. Double marked are output only if switches
27 YYTRANSLATE = vector mapping yylex's token numbers into bison's
30 ++ YYTNAME = vector of string-names indexed by bison token number.
32 ++ YYTOKNUM = vector of yylex token numbers corresponding to
35 YYRLINE = vector of line-numbers of all rules. For yydebug
38 YYRHS = vector of items of all rules. This is exactly what RITEMS
39 contains. For yydebug and for semantic parser.
41 YYPRHS[R] = index in YYRHS of first item for rule R.
43 YYR1[R] = symbol number of symbol that rule R derives.
45 YYR2[R] = number of symbols composing right hand side of rule R.
47 + YYSTOS[S] = the symbol number of the symbol that leads to state
50 YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
51 doesn't specify something else to do. Zero means the default is an
54 YYDEFGOTO[I] = default state to go to after a reduction of a rule
55 that generates variable NTOKENS + I, except when YYTABLE specifies
58 YYPACT[S] = index in YYTABLE of the portion describing state S.
59 The lookahead token's type is used to index that portion to find
62 If the value in YYTABLE is positive, we shift the token and go to
65 If the value is negative, it is minus a rule number to reduce by.
67 If the value is zero, the default action from YYDEFACT[S] is used.
69 YYPGOTO[I] = the index in YYTABLE of the portion describing what to
70 do after reducing a rule that derives variable I + NTOKENS. This
71 portion is indexed by the parser state number, S, as of before the
72 text for this nonterminal was read. The value from YYTABLE is the
73 state to go to if the corresponding value in YYCHECK is S.
75 YYTABLE = a vector filled with portions for different uses, found
76 via YYPACT and YYPGOTO.
78 YYCHECK = a vector indexed in parallel with YYTABLE. It indicates,
79 in a roundabout way, the bounds of the portion you are trying to
82 Suppose that the portion of yytable starts at index P and the index
83 to be examined within the portion is I. Then if YYCHECK[P+I] != I,
84 I is outside the bounds of what is actually allocated, and the
85 default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise,
86 YYTABLE[P+I] should be used.
88 YYFINAL = the state number of the termination state. YYFLAG = most
89 negative short int. Used to flag ?? */
103 #include "conflicts.h"
104 #include "muscle_tab.h"
106 /* From lib/readpipe.h. */
107 FILE *readpipe
PARAMS ((const char *, ...));
109 /* From src/scan-skel.l. */
110 int skel_lex
PARAMS ((void));
111 extern FILE *skel_in
;
115 static short **froms
= NULL
;
116 static short **tos
= NULL
;
117 static short *tally
= NULL
;
118 static short *width
= NULL
;
119 static short *actrow
= NULL
;
120 static short *state_count
= NULL
;
121 static short *order
= NULL
;
122 static short *base
= NULL
;
123 static short *pos
= NULL
;
124 static short *table
= NULL
;
125 static short *check
= NULL
;
129 struct obstack muscle_obstack
;
130 static struct obstack format_obstack
;
132 int error_verbose
= 0;
134 /* Returns the number of lines of S. */
136 get_lines_number (const char *s
)
141 for (i
= 0; s
[i
]; ++i
)
152 output_table_data (struct obstack
*oout
,
161 obstack_fgrow1 (oout
, "%6d", first
);
162 for (i
= begin
; i
< end
; ++i
)
164 obstack_1grow (oout
, ',');
167 obstack_sgrow (oout
, "\n ");
172 obstack_fgrow1 (oout
, "%6d", table_data
[i
]);
174 obstack_1grow (oout
, 0);
179 output_token_translations (void)
181 output_table_data (&format_obstack
, token_translations
,
182 0, 1, max_user_token_number
+ 1);
183 muscle_insert ("translate", obstack_finish (&format_obstack
));
184 XFREE (token_translations
);
193 short *values
= XCALLOC (short, nrules
+ 1);
194 for (i
= 0; i
< nrules
+ 1; ++i
)
195 values
[i
] = rules
[i
].rhs
;
196 output_table_data (&format_obstack
, values
,
201 muscle_insert ("prhs", obstack_finish (&format_obstack
));
207 yyrhs
= XMALLOC (short, nritems
);
209 for (i
= 1; i
< nritems
; ++i
)
210 yyrhs
[i
] = ritem
[i
] >= 0 ? ritem
[i
] : -1;
212 output_table_data (&format_obstack
, yyrhs
,
213 ritem
[0], 1, nritems
);
214 muscle_insert ("rhs", obstack_finish (&format_obstack
));
220 if (!semantic_parser
)
221 obstack_sgrow (&table_obstack
, "\n#endif\n");
230 short *values
= (short *) alloca (sizeof (short) * nstates
);
231 for (i
= 0; i
< nstates
; ++i
)
232 values
[i
] = states
[i
]->accessing_symbol
;
233 output_table_data (&format_obstack
, values
,
235 muscle_insert ("stos", obstack_finish (&format_obstack
));
240 output_rule_data (void)
244 short *short_tab
= NULL
;
247 short *values
= XCALLOC (short, nrules
+ 1);
248 for (i
= 0; i
< nrules
+ 1; ++i
)
249 values
[i
] = rules
[i
].line
;
250 output_table_data (&format_obstack
, values
,
252 muscle_insert ("rline", obstack_finish (&format_obstack
));
258 for (i
= 0; i
< nsyms
; i
++)
260 /* Be sure not to use twice the same quotearg slot. */
262 quotearg_n_style (1, c_quoting_style
,
263 quotearg_style (escape_quoting_style
, symbols
[i
]->tag
));
264 /* Width of the next token, including the two quotes, the coma
266 int strsize
= strlen (cp
) + 2;
268 if (j
+ strsize
> 75)
270 obstack_sgrow (&format_obstack
, "\n ");
274 obstack_sgrow (&format_obstack
, cp
);
275 obstack_sgrow (&format_obstack
, ", ");
278 /* add a NULL entry to list of tokens */
279 obstack_sgrow (&format_obstack
, "NULL");
281 /* Finish table and store. */
282 obstack_1grow (&format_obstack
, 0);
283 muscle_insert ("tname", obstack_finish (&format_obstack
));
285 /* Output YYTOKNUM. */
287 short *values
= XCALLOC (short, ntokens
+ 1);
288 for (i
= 0; i
< ntokens
+ 1; ++i
)
289 values
[i
] = symbols
[i
]->user_token_number
;
290 output_table_data (&format_obstack
, values
,
292 muscle_insert ("toknum", obstack_finish (&format_obstack
));
299 short *values
= XCALLOC (short, nrules
+ 1);
300 for (i
= 0; i
< nrules
+ 1; ++i
)
301 values
[i
] = rules
[i
].lhs
;
302 output_table_data (&format_obstack
, values
,
304 muscle_insert ("r1", obstack_finish (&format_obstack
));
309 short_tab
= XMALLOC (short, nrules
+ 1);
310 for (i
= 1; i
< nrules
; i
++)
311 short_tab
[i
] = rules
[i
+ 1].rhs
- rules
[i
].rhs
- 1;
312 short_tab
[nrules
] = nritems
- rules
[nrules
].rhs
- 1;
313 output_table_data (&format_obstack
, short_tab
,
315 muscle_insert ("r2", obstack_finish (&format_obstack
));
319 /*------------------------------------------------------------------.
320 | Decide what to do for each type of token if seen as the lookahead |
321 | token in specified state. The value returned is used as the |
322 | default action (yydefact) for the state. In addition, actrow is |
323 | filled with what to do for each kind of token, index by symbol |
324 | number, with zero meaning do the default action. The value |
325 | MINSHORT, a very negative number, means this situation is an |
326 | error. The parser recognizes this value specially. |
328 | This is where conflicts are resolved. The loop over lookahead |
329 | rules considered lower-numbered rules last, and the last rule |
330 | considered that likes a token gets to handle it. |
331 `------------------------------------------------------------------*/
334 action_row (state_t
*state
)
337 int default_rule
= 0;
338 reductions
*redp
= state
->reductions
;
339 shifts
*shiftp
= state
->shifts
;
340 errs
*errp
= state
->errs
;
341 /* set nonzero to inhibit having any default reduction */
344 for (i
= 0; i
< ntokens
; i
++)
347 if (redp
->nreds
>= 1)
350 /* loop over all the rules available here which require
352 for (i
= state
->nlookaheads
- 1; i
>= 0; --i
)
353 /* and find each token which the rule finds acceptable
355 for (j
= 0; j
< ntokens
; j
++)
356 /* and record this rule as the rule to use if that
358 if (BITISSET (LA (state
->lookaheadsp
+ i
), j
))
359 actrow
[j
] = -LAruleno
[state
->lookaheadsp
+ i
];
362 /* Now see which tokens are allowed for shifts in this state. For
363 them, record the shift as the thing to do. So shift is preferred
365 for (i
= 0; i
< shiftp
->nshifts
; i
++)
368 int shift_state
= shiftp
->shifts
[i
];
372 symbol
= states
[shift_state
]->accessing_symbol
;
377 actrow
[symbol
] = shift_state
;
379 /* Do not use any default reduction if there is a shift for
381 if (symbol
== error_token_number
)
385 /* See which tokens are an explicit error in this state (due to
386 %nonassoc). For them, record MINSHORT as the action. */
387 for (i
= 0; i
< errp
->nerrs
; i
++)
389 int symbol
= errp
->errs
[i
];
390 actrow
[symbol
] = MINSHORT
;
393 /* Now find the most common reduction and make it the default action
396 if (redp
->nreds
>= 1 && !nodefault
)
398 if (state
->consistent
)
399 default_rule
= redp
->rules
[0];
403 for (i
= 0; i
< state
->nlookaheads
; i
++)
406 int rule
= -LAruleno
[state
->lookaheadsp
+ i
];
409 for (j
= 0; j
< ntokens
; j
++)
410 if (actrow
[j
] == rule
)
420 /* actions which match the default are replaced with zero,
421 which means "use the default" */
426 for (j
= 0; j
< ntokens
; j
++)
427 if (actrow
[j
] == default_rule
)
430 default_rule
= -default_rule
;
435 /* If have no default rule, the default is an error.
436 So replace any action which says "error" with "use default". */
438 if (default_rule
== 0)
439 for (i
= 0; i
< ntokens
; i
++)
440 if (actrow
[i
] == MINSHORT
)
457 for (i
= 0; i
< ntokens
; i
++)
464 froms
[state
] = sp1
= sp
= XCALLOC (short, count
);
465 tos
[state
] = sp2
= XCALLOC (short, count
);
467 for (i
= 0; i
< ntokens
; i
++)
474 tally
[state
] = count
;
475 width
[state
] = sp1
[-1] - sp
[0] + 1;
479 /*------------------------------------------------------------------.
480 | Figure out the actions for the specified state, indexed by |
481 | lookahead token type. |
483 | The YYDEFACT table is output now. The detailed info is saved for |
484 | putting into YYTABLE later. |
485 `------------------------------------------------------------------*/
491 short *yydefact
= XCALLOC (short, nstates
);
493 actrow
= XCALLOC (short, ntokens
);
494 for (i
= 0; i
< nstates
; ++i
)
496 yydefact
[i
] = action_row (states
[i
]);
500 output_table_data (&format_obstack
, yydefact
,
501 yydefact
[0], 1, nstates
);
502 muscle_insert ("defact", obstack_finish (&format_obstack
));
509 /*-----------------------------.
510 | Output the actions to OOUT. |
511 `-----------------------------*/
514 actions_output (FILE *out
)
517 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
518 if (rules
[rule
].action
)
520 fprintf (out
, " case %d:\n", rule
);
523 fprintf (out
, muscle_find ("linef"),
524 rules
[rule
].action_line
,
525 quotearg_style (c_quoting_style
,
526 muscle_find ("filename")));
527 /* As a Bison extension, add the ending semicolon. Since some
528 Yacc don't do that, help people using bison as a Yacc
529 finding their missing semicolons. */
530 fprintf (out
, "{ %s%s }\n break;\n\n",
532 yacc_flag
? ";" : "");
537 /*----------------------------.
538 | Output the guards to OOUT. |
539 `----------------------------*/
542 guards_output (FILE *out
)
545 for (rule
= 1; rule
< nrules
+ 1; ++rule
)
546 if (rules
[rule
].guard
)
548 fprintf (out
, " case %d:\n", rule
);
551 fprintf (out
, muscle_find ("linef"),
552 rules
[rule
].guard_line
,
553 quotearg_style (c_quoting_style
,
554 muscle_find ("filename")));
555 fprintf (out
, "{ %s; }\n break;\n\n",
561 /*---------------------------------------.
562 | Output the tokens definition to OOUT. |
563 `---------------------------------------*/
566 token_definitions_output (FILE *out
)
569 for (i
= 0; i
< ntokens
; ++i
)
571 bucket
*symbol
= symbols
[i
];
572 int number
= symbol
->user_token_number
;
574 if (number
== SALIAS
)
576 /* Skip error token. */
577 if (symbol
->value
== error_token_number
)
579 if (symbol
->tag
[0] == '\'')
580 continue; /* skip literal character */
581 if (symbol
->tag
[0] == '\"')
583 /* use literal string only if given a symbol with an alias */
585 symbol
= symbol
->alias
;
590 /* Don't #define nonliteral tokens whose names contain periods
591 or '$' (as does the default value of the EOF token). */
592 if (strchr (symbol
->tag
, '.') || strchr (symbol
->tag
, '$'))
595 fprintf (out
, "# define %s\t%d\n",
596 symbol
->tag
, number
);
598 /* FIXME: This is probably wrong, and should be just as
600 fprintf (out
, "# define T%s\t%d\n", symbol
->tag
, symbol
->value
);
606 save_column (int symbol
, int default_state
)
613 int symno
= symbol
- ntokens
+ nstates
;
615 short begin
= goto_map
[symbol
];
616 short end
= goto_map
[symbol
+ 1];
619 for (i
= begin
; i
< end
; i
++)
620 if (to_state
[i
] != default_state
)
626 froms
[symno
] = sp1
= sp
= XCALLOC (short, count
);
627 tos
[symno
] = sp2
= XCALLOC (short, count
);
629 for (i
= begin
; i
< end
; i
++)
630 if (to_state
[i
] != default_state
)
632 *sp1
++ = from_state
[i
];
633 *sp2
++ = to_state
[i
];
636 tally
[symno
] = count
;
637 width
[symno
] = sp1
[-1] - sp
[0] + 1;
641 default_goto (int symbol
)
644 int m
= goto_map
[symbol
];
645 int n
= goto_map
[symbol
+ 1];
646 int default_state
= -1;
652 for (i
= 0; i
< nstates
; i
++)
655 for (i
= m
; i
< n
; i
++)
656 state_count
[to_state
[i
]]++;
658 for (i
= 0; i
< nstates
; i
++)
659 if (state_count
[i
] > max
)
661 max
= state_count
[i
];
665 return default_state
;
669 /*-------------------------------------------------------------------.
670 | Figure out what to do after reducing with each rule, depending on |
671 | the saved state from before the beginning of parsing the data that |
672 | matched this rule. |
674 | The YYDEFGOTO table is output now. The detailed info is saved for |
675 | putting into YYTABLE later. |
676 `-------------------------------------------------------------------*/
682 short *yydefgoto
= XMALLOC (short, nsyms
- ntokens
);
684 state_count
= XCALLOC (short, nstates
);
685 for (i
= ntokens
; i
< nsyms
; ++i
)
687 int default_state
= default_goto (i
);
688 save_column (i
, default_state
);
689 yydefgoto
[i
- ntokens
] = default_state
;
692 output_table_data (&format_obstack
, yydefgoto
,
693 yydefgoto
[0], 1, nsyms
- ntokens
);
694 muscle_insert ("defgoto", obstack_finish (&format_obstack
));
701 /* The next few functions decide how to pack the actions and gotos
702 information into yytable. */
709 order
= XCALLOC (short, nvectors
);
712 for (i
= 0; i
< nvectors
; i
++)
718 int j
= nentries
- 1;
720 while (j
>= 0 && (width
[order
[j
]] < w
))
723 while (j
>= 0 && (width
[order
[j
]] == w
) && (tally
[order
[j
]] < t
))
726 for (k
= nentries
- 1; k
> j
; k
--)
727 order
[k
+ 1] = order
[k
];
736 matching_state (int vector
)
738 int i
= order
[vector
];
749 for (prev
= vector
- 1; prev
>= 0; prev
--)
755 if (width
[j
] != w
|| tally
[j
] != t
)
758 for (k
= 0; match
&& k
< t
; k
++)
759 if (tos
[j
][k
] != tos
[i
][k
] || froms
[j
][k
] != froms
[i
][k
])
771 pack_vector (int vector
)
773 int i
= order
[vector
];
777 short *from
= froms
[i
];
782 for (j
= lowzero
- from
[0]; j
< MAXTABLE
; j
++)
787 for (k
= 0; ok
&& k
< t
; k
++)
791 fatal (_("maximum table size (%d) exceeded"), MAXTABLE
);
797 for (k
= 0; ok
&& k
< vector
; k
++)
803 for (k
= 0; k
< t
; k
++)
807 check
[loc
] = from
[k
];
810 while (table
[lowzero
] != 0)
819 #define pack_vector_succeeded 0
820 assert (pack_vector_succeeded
);
832 base
= XCALLOC (short, nvectors
);
833 pos
= XCALLOC (short, nentries
);
834 table
= XCALLOC (short, MAXTABLE
);
835 check
= XCALLOC (short, MAXTABLE
);
840 for (i
= 0; i
< nvectors
; i
++)
843 for (i
= 0; i
< MAXTABLE
; i
++)
846 for (i
= 0; i
< nentries
; i
++)
848 state
= matching_state (i
);
851 place
= pack_vector (i
);
856 base
[order
[i
]] = place
;
859 for (i
= 0; i
< nvectors
; i
++)
870 /* the following functions output yytable, yycheck
871 and the vectors whose elements index the portion starts */
877 output_table_data (&format_obstack
, base
,
878 base
[0], 1, nstates
);
879 muscle_insert ("pact", obstack_finish (&format_obstack
));
882 output_table_data (&format_obstack
, base
,
883 base
[nstates
], nstates
+ 1, nvectors
);
884 muscle_insert ("pgoto", obstack_finish (&format_obstack
));
893 output_table_data (&format_obstack
, table
,
894 table
[0], 1, high
+ 1);
895 muscle_insert ("table", obstack_finish (&format_obstack
));
903 output_table_data (&format_obstack
, check
,
904 check
[0], 1, high
+ 1);
905 muscle_insert ("check", obstack_finish (&format_obstack
));
909 /* compute and output yydefact, yydefgoto, yypact, yypgoto, yytable
913 output_actions (void)
916 nvectors
= nstates
+ nvars
;
918 froms
= XCALLOC (short *, nvectors
);
919 tos
= XCALLOC (short *, nvectors
);
920 tally
= XCALLOC (short, nvectors
);
921 width
= XCALLOC (short, nvectors
);
928 XFREE (goto_map
+ ntokens
);
940 for (i
= 0; i
< nstates
; ++i
)
942 free (states
[i
]->shifts
);
943 XFREE (states
[i
]->reductions
);
944 free (states
[i
]->errs
);
951 /*---------------------------.
952 | Call the skeleton parser. |
953 `---------------------------*/
956 output_skeleton (void)
958 /* Find the right skeleton file. */
962 skeleton
= "bison.hairy";
964 skeleton
= "bison.simple";
967 /* Parse the skeleton file and output the needed parsers. */
968 muscle_insert ("skeleton", skeleton
);
970 /* Store the definition of all the muscles. */
972 FILE *muscles_m4
= xfopen ("/tmp/muscles.m4", "w");
973 /* There are no comments, especially not `#': we do want M4 expansion
974 after `#': think of CPP macros! */
975 fprintf (muscles_m4
, "m4_changecom()\n");
976 fprintf (muscles_m4
, "m4_init()\n");
978 fprintf (muscles_m4
, "m4_define([b4_actions], \n[[");
979 actions_output (muscles_m4
);
980 fprintf (muscles_m4
, "]])\n\n");
982 fprintf (muscles_m4
, "m4_define([b4_guards], \n[[");
983 guards_output (muscles_m4
);
984 fprintf (muscles_m4
, "]])\n\n");
986 fprintf (muscles_m4
, "m4_define([b4_tokendef], \n[[");
987 token_definitions_output (muscles_m4
);
988 fprintf (muscles_m4
, "]])\n\n");
990 muscles_m4_output (muscles_m4
);
992 fprintf (muscles_m4
, "m4_wrap([m4_divert_pop(0)])\n");
993 fprintf (muscles_m4
, "m4_divert_push(0)dnl\n");
994 xfclose (muscles_m4
);
997 /* Invoke m4 on the definition of the muscles, and the skeleton. */
999 const char *bison_pkgdatadir
= getenv ("BISON_PKGDATADIR");
1000 if (!bison_pkgdatadir
)
1001 bison_pkgdatadir
= PKGDATADIR
;
1002 skel_in
= readpipe ("m4",
1005 "m4sugar/m4sugar.m4",
1010 error (EXIT_FAILURE
, errno
, "cannot run m4");
1018 MUSCLE_INSERT_INT ("last", high
);
1019 MUSCLE_INSERT_INT ("flag", MINSHORT
);
1020 MUSCLE_INSERT_INT ("pure", pure_parser
);
1021 MUSCLE_INSERT_INT ("nsym", nsyms
);
1022 MUSCLE_INSERT_INT ("debug", debug_flag
);
1023 MUSCLE_INSERT_INT ("final", final_state
);
1024 MUSCLE_INSERT_INT ("maxtok", max_user_token_number
);
1025 MUSCLE_INSERT_INT ("error_verbose", error_verbose
);
1026 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix
? spec_name_prefix
: "yy");
1028 /* FIXME: This is wrong: the muscles should decide whether they hold
1029 a copy or not, but the situation is too obscure currently. */
1030 MUSCLE_INSERT_STRING ("output_infix", output_infix
? output_infix
: "");
1031 MUSCLE_INSERT_STRING ("output_prefix", short_base_name
);
1032 MUSCLE_INSERT_STRING ("output_parser_name", parser_file_name
);
1033 MUSCLE_INSERT_STRING ("output_header_name", spec_defines_file
);
1035 MUSCLE_INSERT_INT ("nnts", nvars
);
1036 MUSCLE_INSERT_INT ("nrules", nrules
);
1037 MUSCLE_INSERT_INT ("nstates", nstates
);
1038 MUSCLE_INSERT_INT ("ntokens", ntokens
);
1040 MUSCLE_INSERT_INT ("locations_flag", locations_flag
);
1041 MUSCLE_INSERT_INT ("defines_flag", defines_flag
);
1044 /*-------------------------.
1045 | Output the header file. |
1046 `-------------------------*/
1049 header_output (void)
1051 FILE *out
= xfopen (spec_defines_file
, "w");
1052 char *macro_name
= compute_header_macro ();
1054 fprintf (out
, "#ifndef %s\n", macro_name
);
1055 fprintf (out
, "# define %s\n\n", macro_name
);
1057 token_definitions_output (out
);
1062 # define YYSTYPE yystype\n\
1064 muscle_find ("stype"));
1067 fprintf (out
, "\nextern YYSTYPE %slval;\n",
1068 spec_name_prefix
? spec_name_prefix
: "yy");
1072 fputs ("\n\n", out
);
1075 typedef struct yyltype\n\
1078 int first_column;\n\
1082 # define YYLTYPE yyltype\n\
1085 fprintf (out
, "\nextern YYLTYPE %slloc;\n",
1086 spec_name_prefix
? spec_name_prefix
: "yy");
1089 if (semantic_parser
)
1093 for (i
= ntokens
; i
< nsyms
; i
++)
1094 /* don't make these for dummy nonterminals made by gensym. */
1095 if (*symbols
[i
]->tag
!= '@')
1096 fprintf (out
, "# define NT%s\t%d\n", symbols
[i
]->tag
, i
);
1099 fprintf (out
, "\n#endif /* not %s */\n", macro_name
);
1105 /*----------------------------------------------------------.
1106 | Output the parsing tables and the parser code to ftable. |
1107 `----------------------------------------------------------*/
1112 obstack_init (&format_obstack
);
1114 output_token_translations ();
1118 if (semantic_parser
)
1120 output_rule_data ();
1124 /* Copy definitions in directive. */
1125 obstack_1grow (&attrs_obstack
, 0);
1126 muscle_insert ("prologue", obstack_finish (&attrs_obstack
));
1128 /* Process the selected skeleton file. */
1131 /* Output the header if needed. */
1137 obstack_free (&muscle_obstack
, NULL
);
1138 obstack_free (&format_obstack
, NULL
);
1139 obstack_free (&action_obstack
, NULL
);
1140 obstack_free (&attrs_obstack
, NULL
);