X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/366eea36d3a9aaccf80a78c2fcd8c3cd6b563e25..bc933ef16d171af4f27616649c7a99c77e9b75fe:/src/symtab.c diff --git a/src/symtab.c b/src/symtab.c index 57bb7965..5908c092 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -51,11 +51,13 @@ symbol_new (const char *tag, location_t location) res->type_name = NULL; res->destructor = NULL; + res->printer = NULL; res->number = NUMBER_UNDEFINED; res->prec = 0; res->assoc = right_assoc; res->user_token_number = USER_NUMBER_UNDEFINED; + res->alias = NULL; res->class = unknown_sym; @@ -105,7 +107,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) { @@ -122,7 +124,7 @@ symbol_type_set (symbol_t *symbol, location_t location, char *type_name) `-------------------------------------------------------------------*/ void -symbol_destructor_set (symbol_t *symbol, location_t location, char *destructor) +symbol_destructor_set (symbol_t *symbol, char *destructor, location_t location) { if (destructor) { @@ -161,8 +163,8 @@ symbol_printer_set (symbol_t *symbol, char *printer, location_t location) `------------------------------------------------------------------*/ 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) { @@ -175,7 +177,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); } @@ -184,10 +186,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++; @@ -203,14 +205,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? */ @@ -446,7 +449,7 @@ symbols_new (void) `----------------------------------------------------------------*/ symbol_t * -getsym (const char *key, location_t location) +symbol_get (const char *key, location_t location) { symbol_t probe; symbol_t *entry; @@ -464,6 +467,28 @@ getsym (const char *key, location_t location) } +/*------------------------------------------------------------------. +| Generate a dummy nonterminal, whose name cannot conflict with the | +| user's names. | +`------------------------------------------------------------------*/ + +symbol_t * +dummy_symbol_get (location_t location) +{ + /* Incremented for each generated symbol. */ + static int dummy_count = 0; + static char buf[256]; + + symbol_t *sym; + + sprintf (buf, "@%d", ++dummy_count); + sym = symbol_get (buf, location); + sym->class = nterm_sym; + sym->number = nvars++; + return sym; +} + + /*-------------------. | Free the symbols. | `-------------------*/