X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/dafdc66ff0a0344c390d0f5612e9b469d6855e00..febef6caeca3c31c336edd636609d9f4ec865452:/src/symtab.c diff --git a/src/symtab.c b/src/symtab.c index d605687b..bb1b275e 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -47,8 +47,11 @@ symbol_new (const char *tag, location_t location) symbol_t *res = XMALLOC (symbol_t, 1); res->tag = xstrdup (tag); - res->type_name = NULL; res->location = location; + + res->type_name = NULL; + res->destructor = NULL; + res->number = NUMBER_UNDEFINED; res->prec = 0; res->assoc = right_assoc; @@ -102,7 +105,7 @@ symbol_tag_print (symbol_t *symbol, FILE *out) `------------------------------------------------------------------*/ void -symbol_type_set (symbol_t *symbol, location_t location, char *type_name) +symbol_type_set (symbol_t *symbol, char *type_name, location_t location) { if (type_name) { @@ -114,14 +117,52 @@ symbol_type_set (symbol_t *symbol, location_t location, char *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_get (symbol)); + 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_get (symbol)); + 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, location_t location, - int prec, associativity assoc) +symbol_precedence_set (symbol_t *symbol, + int prec, associativity assoc, location_t location) { if (assoc != undef_assoc) { @@ -134,7 +175,7 @@ symbol_precedence_set (symbol_t *symbol, location_t location, } /* Only terminals have a precedence. */ - symbol_class_set (symbol, token_sym); + symbol_class_set (symbol, token_sym, location); } @@ -143,10 +184,10 @@ symbol_precedence_set (symbol_t *symbol, location_t location, `-------------------------------------*/ void -symbol_class_set (symbol_t *symbol, symbol_class class) +symbol_class_set (symbol_t *symbol, symbol_class class, location_t location) { if (symbol->class != unknown_sym && symbol->class != class) - complain (_("symbol %s redefined"), symbol_tag_get (symbol)); + complain_at (location, _("symbol %s redefined"), symbol_tag_get (symbol)); if (class == nterm_sym && symbol->class != nterm_sym) symbol->number = nvars++; @@ -162,14 +203,15 @@ symbol_class_set (symbol_t *symbol, symbol_class class) `-------------------------------------------------*/ void -symbol_user_token_number_set (symbol_t *symbol, int user_token_number) +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 (_("redefining user token number of %s"), - symbol_tag_get (symbol)); + complain_at (location, _("redefining user token number of %s"), + symbol_tag_get (symbol)); symbol->user_token_number = user_token_number; /* User defined EOF token? */