-/*------------------------.
-| Operations on symbols. |
-`------------------------*/
-
-
-/*-----------------------------------------------------------.
-| If THIS is not defined, report an error, and consider it a |
-| nonterminal. |
-`-----------------------------------------------------------*/
-
-static bool
-symbol_check_defined (symbol_t *this)
-{
- if (this->class == unknown_sym)
- {
- complain
- (_("symbol %s is used, but is not defined as a token and has no rules"),
- this->tag);
- this->class = nterm_sym;
- this->number = nvars++;
- }
-
- return TRUE;
-}
-
-
-/*-------------------------------------------------------------------.
-| Assign a symbol number, and write the definition of the token name |
-| into FDEFINES. Put in SYMBOLS. |
-`-------------------------------------------------------------------*/
-
-static bool
-symbol_make_alias (symbol_t *symbol, char *typename)
-{
- if (symval->alias)
- warn (_("symbol `%s' used more than once as a literal string"),
- symval->tag);
- else if (symbol->alias)
- warn (_("symbol `%s' given more than one literal string"),
- symbol->tag);
- else
- {
- symval->class = token_sym;
- symval->type_name = typename;
- symval->user_token_number = symbol->user_token_number;
- symbol->user_token_number = USER_NUMBER_ALIAS;
- symval->alias = symbol;
- symbol->alias = symval;
- /* symbol and symval combined are only one symbol */
- nsyms--;
- ntokens--;
- assert (ntokens == symbol->number || ntokens == symval->number);
- symbol->number = symval->number =
- (symval->number < symbol->number) ? symval->number : symbol->number;
- }
-
- return TRUE;
-}
-
-/*---------------------------------------------------------.
-| Check that THIS, and its alias, have same precedence and |
-| associativity. |
-`---------------------------------------------------------*/
-
-static bool
-symbol_check_alias_consistence (symbol_t *this)
-{
- /* Check only those who _are_ the aliases. */
- if (this->alias && this->user_token_number == USER_NUMBER_ALIAS)
- {
- if (this->prec != this->alias->prec)
- {
- if (this->prec != 0 && this->alias->prec != 0)
- complain (_("conflicting precedences for %s and %s"),
- this->tag, this->alias->tag);
- if (this->prec != 0)
- this->alias->prec = this->prec;
- else
- this->prec = this->alias->prec;
- }
-
- if (this->assoc != this->alias->assoc)
- {
- if (this->assoc != 0 && this->alias->assoc != 0)
- complain (_("conflicting assoc values for %s and %s"),
- this->tag, this->alias->tag);
- if (this->assoc != 0)
- this->alias->assoc = this->assoc;
- else
- this->assoc = this->alias->assoc;
- }
- }
- return TRUE;
-}
-
-
-/*-------------------------------------------------------------------.
-| Assign a symbol number, and write the definition of the token name |
-| into FDEFINES. Put in SYMBOLS. |
-`-------------------------------------------------------------------*/
-
-static bool
-symbol_pack (symbol_t *this)
-{
- if (this->class == nterm_sym)
- {
- this->number += ntokens;
- }
- 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"),
- symbols[token_translations[this->user_token_number]]->tag,
- this->tag, this->user_token_number);
-
- token_translations[this->user_token_number] = this->number;
- }
-
- return TRUE;
-}
-\f
-