+/*------------------------------------------------------------------.
+| Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 |
+| as TYPE_NAME. |
+`------------------------------------------------------------------*/
+
+void
+symbol_type_set (symbol_t *symbol, char *type_name, location_t location)
+{
+ if (type_name)
+ {
+ if (symbol->type_name)
+ complain_at (location,
+ _("type redeclaration for %s"), symbol->tag);
+ symbol->type_name = type_name;
+ }
+}
+
+
+/*-------------------------------------------------------------------.
+| Set the DESTRUCTOR associated to SYMBOL. Do nothing if passed 0. |
+`-------------------------------------------------------------------*/
+
+void
+symbol_destructor_set (symbol_t *symbol, char *destructor, location_t location)
+{
+ if (destructor)
+ {
+ if (symbol->destructor)
+ complain_at (location,
+ _("%s redeclaration for %s"),
+ "%destructor", symbol->tag);
+ symbol->destructor = destructor;
+ symbol->destructor_location = location;
+ }
+}
+
+
+/*----------------------------------------------------------------.
+| Set the PRITNER associated to SYMBOL. Do nothing if passed 0. |
+`----------------------------------------------------------------*/
+
+void
+symbol_printer_set (symbol_t *symbol, char *printer, location_t location)
+{
+ if (printer)
+ {
+ if (symbol->printer)
+ complain_at (location,
+ _("%s redeclaration for %s"),
+ "%printer", symbol->tag);
+ symbol->printer = printer;
+ symbol->printer_location = location;
+ }
+}
+
+
+/*------------------------------------------------------------------.
+| Set the PRECEDENCE associated to SYMBOL. Does nothing if invoked |
+| with UNDEF_ASSOC as ASSOC. |
+`------------------------------------------------------------------*/
+
+void
+symbol_precedence_set (symbol_t *symbol,
+ int prec, assoc_t assoc, location_t location)
+{
+ if (assoc != undef_assoc)
+ {
+ if (symbol->prec != 0)
+ complain_at (location,
+ _("redefining precedence of %s"),
+ symbol->tag);
+ symbol->prec = prec;
+ symbol->assoc = assoc;
+ }
+
+ /* Only terminals have a precedence. */
+ symbol_class_set (symbol, token_sym, location);
+}
+
+
+/*-------------------------------------.
+| Set the CLASS associated to SYMBOL. |
+`-------------------------------------*/
+
+void
+symbol_class_set (symbol_t *symbol, symbol_class class, location_t location)
+{
+ if (symbol->class != unknown_sym && symbol->class != class)
+ complain_at (location, _("symbol %s redefined"), symbol->tag);
+
+ if (class == nterm_sym && symbol->class != nterm_sym)
+ symbol->number = nvars++;
+ else if (class == token_sym && symbol->number == NUMBER_UNDEFINED)
+ symbol->number = ntokens++;
+
+ symbol->class = class;
+}
+
+
+/*-------------------------------------------------.
+| Set the USER_TOKEN_NUMBER associated to SYMBOL. |
+`-------------------------------------------------*/
+
+void
+symbol_user_token_number_set (symbol_t *symbol,
+ int user_token_number, location_t location)
+{
+ assert (symbol->class == token_sym);
+
+ if (symbol->user_token_number != USER_NUMBER_UNDEFINED
+ && symbol->user_token_number != user_token_number)
+ complain_at (location, _("redefining user token number of %s"),
+ symbol->tag);
+
+ symbol->user_token_number = user_token_number;
+ /* User defined $end token? */
+ if (user_token_number == 0)
+ {
+ endtoken = symbol;
+ endtoken->number = 0;
+ /* It is always mapped to 0, so it was already counted in
+ NTOKENS. */
+ --ntokens;
+ }
+}
+
+