X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/0fb669f9d648dfdd7a39478a6b658511455ae966..e2a8c0f591c1f8ca0909faee23914f62bacb866c:/src/symtab.c diff --git a/src/symtab.c b/src/symtab.c index aabf3343..ef59c6ee 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -1,7 +1,7 @@ /* Symbol table manager for Bison. - Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005 Free Software - Foundation, Inc. + Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006 Free + Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -20,7 +20,7 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - +#include #include "system.h" #include @@ -65,6 +65,7 @@ symbol_new (uniqstr tag, location loc) res->alias = NULL; res->class = unknown_sym; + res->declared = false; if (nsyms == SYMBOL_NUMBER_MAXIMUM) fatal (_("too many symbols in input grammar (limit is %d)"), @@ -74,6 +75,30 @@ symbol_new (uniqstr tag, location loc) } +/*-----------------. +| Print a symbol. | +`-----------------*/ + +#define SYMBOL_ATTR_PRINT(Attr) \ + if (s->Attr) \ + fprintf (f, " %s { %s }", #Attr, s->Attr) + +void +symbol_print (symbol *s, FILE *f) +{ + if (s) + { + fprintf (f, "\"%s\"", s->tag); + SYMBOL_ATTR_PRINT (type_name); + SYMBOL_ATTR_PRINT (destructor); + SYMBOL_ATTR_PRINT (printer); + } + else + fprintf (f, ""); +} + +#undef SYMBOL_ATTR_PRINT + /*------------------------------------------------------------------. | Complain that S's WHAT is redeclared at SECOND, and was first set | | at FIRST. | @@ -111,7 +136,7 @@ symbol_type_set (symbol *sym, uniqstr type_name, location loc) `------------------------------------------------------------------*/ void -symbol_destructor_set (symbol *sym, char *destructor, location loc) +symbol_destructor_set (symbol *sym, const char *destructor, location loc) { if (destructor) { @@ -128,7 +153,7 @@ symbol_destructor_set (symbol *sym, char *destructor, location loc) `---------------------------------------------------------------*/ void -symbol_printer_set (symbol *sym, char *printer, location loc) +symbol_printer_set (symbol *sym, const char *printer, location loc) { if (printer) { @@ -158,7 +183,7 @@ symbol_precedence_set (symbol *sym, int prec, assoc a, location loc) } /* Only terminals have a precedence. */ - symbol_class_set (sym, token_sym, loc); + symbol_class_set (sym, token_sym, loc, false); } @@ -167,10 +192,13 @@ symbol_precedence_set (symbol *sym, int prec, assoc a, location loc) `------------------------------------*/ void -symbol_class_set (symbol *sym, symbol_class class, location loc) +symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring) { if (sym->class != unknown_sym && sym->class != class) - complain_at (loc, _("symbol %s redefined"), sym->tag); + { + complain_at (loc, _("symbol %s redefined"), sym->tag); + sym->declared = false; + } if (class == nterm_sym && sym->class != nterm_sym) sym->number = nvars++; @@ -178,6 +206,13 @@ symbol_class_set (symbol *sym, symbol_class class, location loc) sym->number = ntokens++; sym->class = class; + + if (declaring) + { + if (sym->declared) + warn_at (loc, _("symbol %s redeclared"), sym->tag); + sym->declared = true; + } } @@ -188,8 +223,7 @@ symbol_class_set (symbol *sym, symbol_class class, location loc) void symbol_user_token_number_set (symbol *sym, int user_token_number, location loc) { - if (sym->class != token_sym) - abort (); + assert (sym->class == token_sym); if (sym->user_token_number != USER_NUMBER_UNDEFINED && sym->user_token_number != user_token_number) @@ -260,8 +294,7 @@ symbol_make_alias (symbol *sym, symbol *symval, location loc) /* sym and symval combined are only one symbol. */ nsyms--; ntokens--; - if (ntokens != sym->number && ntokens != symval->number) - abort (); + assert (ntokens == sym->number || ntokens == symval->number); sym->number = symval->number = (symval->number < sym->number) ? symval->number : sym->number; symbol_type_set (symval, sym->type_name, loc); @@ -354,8 +387,7 @@ symbol_pack (symbol *this) this->number = this->alias->number = 0; else { - if (this->alias->number == NUMBER_UNDEFINED) - abort (); + assert (this->alias->number != NUMBER_UNDEFINED); this->number = this->alias->number; } } @@ -364,10 +396,7 @@ symbol_pack (symbol *this) return true; } else /* this->class == token_sym */ - { - if (this->number == NUMBER_UNDEFINED) - abort (); - } + assert (this->number != NUMBER_UNDEFINED); symbols[this->number] = this; return true;