+/*--------------------.
+| Output the header. |
+`--------------------*/
+
+static void
+symbols_output (void)
+{
+ if (defines_flag)
+ {
+ output_token_defines (&defines_obstack);
+
+ if (!pure_parser)
+ {
+ if (spec_name_prefix)
+ obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n",
+ spec_name_prefix);
+ else
+ obstack_sgrow (&defines_obstack,
+ "\nextern YYSTYPE yylval;\n");
+ }
+
+ if (semantic_parser)
+ {
+ int i;
+
+ for (i = ntokens; i < nsyms; i++)
+ {
+ /* don't make these for dummy nonterminals made by gensym. */
+ if (*tags[i] != '@')
+ obstack_fgrow2 (&defines_obstack,
+ "# define\tNT%s\t%d\n", tags[i], i);
+ }
+#if 0
+ /* `fdefines' is now a temporary file, so we need to copy its
+ contents in `done', so we can't close it here. */
+ fclose (fdefines);
+ fdefines = NULL;
+#endif
+ }
+ }
+}
+
+
+/*------------------------------------------------------------------.
+| Set TOKEN_TRANSLATIONS. Check that no two symbols share the same |
+| number. |
+`------------------------------------------------------------------*/
+
+static void
+token_translations_init (void)
+{
+ bucket *bp = NULL;
+ int i;
+
+ token_translations = XCALLOC (short, max_user_token_number + 1);
+
+ /* Initialize all entries for literal tokens to 2, the internal
+ token number for $undefined., which represents all invalid
+ inputs. */
+ for (i = 0; i <= max_user_token_number; i++)
+ token_translations[i] = 2;
+
+ for (bp = firstsymbol; bp; bp = bp->next)
+ {
+ /* Non-terminal? */
+ if (bp->value >= ntokens)
+ continue;
+ /* A token string alias? */
+ if (bp->user_token_number == SALIAS)
+ continue;
+
+ assert (bp->user_token_number != SUNDEF);
+
+ /* A token which translation has already been set? */
+ if (token_translations[bp->user_token_number] != 2)
+ complain (_("tokens %s and %s both assigned number %d"),
+ tags[token_translations[bp->user_token_number]],
+ bp->tag, bp->user_token_number);
+ token_translations[bp->user_token_number] = bp->value;
+ }
+}
+
+