+ else if (this->alias)
+ {
+ /* This symbol and its alias are a single token defn.
+ Allocate a tokno, and assign to both check agreement of
+ prec and assoc fields and make both the same */
+ if (this->number == NUMBER_UNDEFINED)
+ {
+ if (this == eoftoken || this->alias == eoftoken)
+ this->number = this->alias->number = 0;
+ else
+ {
+ assert (this->alias->number != NUMBER_UNDEFINED);
+ this->number = this->alias->number;
+ }
+ }
+ /* Do not do processing below for USER_NUMBER_ALIASs. */
+ if (this->user_token_number == USER_NUMBER_ALIAS)
+ return TRUE;
+ }
+ else /* this->class == token_sym */
+ {
+ assert (this->number != NUMBER_UNDEFINED);
+ }
+
+ symbols[this->number] = this;
+ return TRUE;
+}
+
+
+
+
+/*--------------------------------------------------.
+| Put THIS in TOKEN_TRANSLATIONS if it is a token. |
+`--------------------------------------------------*/
+
+static bool
+symbol_translation (symbol_t *this)
+{
+ /* Non-terminal? */
+ if (this->class == token_sym
+ && this->user_token_number != USER_NUMBER_ALIAS)
+ {
+ /* A token which translation has already been set? */
+ if (token_translations[this->user_token_number] != undeftoken->number)
+ complain (_("tokens %s and %s both assigned number %d"),
+ symbol_tag_get (symbols[token_translations[this->user_token_number]]),
+ symbol_tag_get (this), this->user_token_number);
+
+ token_translations[this->user_token_number] = this->number;
+ }
+
+ return TRUE;
+}
+
+
+/*----------------------.
+| A symbol hash table. |
+`----------------------*/
+
+/* Initial capacity of symbols hash table. */
+#define HT_INITIAL_CAPACITY 257
+
+static struct hash_table *symbol_table = NULL;
+
+static bool
+hash_compare_symbol_t (const symbol_t *m1, const symbol_t *m2)
+{
+ return strcmp (m1->tag, m2->tag) ? FALSE : TRUE;
+}
+
+static unsigned int
+hash_symbol_t (const symbol_t *m, unsigned int tablesize)
+{
+ return hash_string (m->tag, tablesize);
+}
+
+
+/*-------------------------------.
+| Create the symbol hash table. |
+`-------------------------------*/
+
+void
+symbols_new (void)
+{
+ symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
+ NULL,
+ (Hash_hasher) hash_symbol_t,
+ (Hash_comparator) hash_compare_symbol_t,
+ (Hash_data_freer) symbol_free);
+}
+
+
+/*----------------------------------------------------------------.
+| Find the symbol named KEY, and return it. If it does not exist |
+| yet, create it. |
+`----------------------------------------------------------------*/
+
+symbol_t *
+getsym (const char *key, location_t location)
+{
+ symbol_t probe;
+ symbol_t *entry;
+
+ (const char *) probe.tag = key;
+ entry = hash_lookup (symbol_table, &probe);