+ 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;
+ }