+
+ /* If 256 is not used, assign it to error, to follow POSIX. */
+ if (num_256_available_p
+ && errtoken->user_token_number == USER_NUMBER_UNDEFINED)
+ errtoken->user_token_number = 256;
+
+ /* Set the missing user numbers. */
+ if (max_user_token_number < 256)
+ max_user_token_number = 256;
+
+ for (i = 0; i < ntokens; ++i)
+ {
+ symbol_t *this = symbols[i];
+ if (this->user_token_number == USER_NUMBER_UNDEFINED)
+ this->user_token_number = ++max_user_token_number;
+ if (this->user_token_number > max_user_token_number)
+ max_user_token_number = this->user_token_number;
+ }
+
+ token_translations = XCALLOC (symbol_number_t, 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 + 1; i++)
+ token_translations[i] = undeftoken->number;
+ symbols_do (symbol_translation, NULL);
+}
+
+
+/*----------------------------------------------------------------.
+| Assign symbol numbers, and write definition of token names into |
+| FDEFINES. Set up vectors SYMBOL_TABLE, TAGS of symbols. |
+`----------------------------------------------------------------*/
+
+void
+symbols_pack (void)
+{
+ symbols = XCALLOC (symbol_t *, nsyms);
+
+ symbols_do (symbol_check_alias_consistence, NULL);
+ symbols_do (symbol_pack, NULL);
+
+ symbols_token_translations_init ();
+
+ if (startsymbol->class == unknown_sym)
+ fatal_at (startsymbol_location,
+ _("the start symbol %s is undefined"),
+ startsymbol->tag);
+ else if (startsymbol->class == token_sym)
+ fatal_at (startsymbol_location,
+ _("the start symbol %s is a token"),
+ startsymbol->tag);