From: Paul Eggert Date: Tue, 3 Jan 2006 21:31:57 +0000 (+0000) Subject: Warn about dubious constructions like "%token T T". X-Git-Tag: v2.3b~521 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/073f92889fed2bb511833920e841243a749223ca Warn about dubious constructions like "%token T T". * src/symtab.h (struct symbol.declared): New member. * src/symtab.c (symbol_new): Initialize it to false. (symbol_class_set): New arg DECLARING, specifying whether this is a declaration that we want to warn about, if there is more than one of them. All uses changed. --- diff --git a/ChangeLog b/ChangeLog index 337397c1..f9907482 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2006-01-03 Paul Eggert + Warn about dubious constructions like "%token T T". + Reported by twlevo. + * src/symtab.h (struct symbol.declared): New member. + * src/symtab.c (symbol_new): Initialize it to false. + (symbol_class_set): New arg DECLARING, specifying whether + this is a declaration that we want to warn about, if there + is more than one of them. All uses changed. + * data/glr.c, data/glr.cc, data/lalr1.cc, data/yacc.c: Allow multiple %union directives, whose contents concatenate. * src/parse-gram.y (grammar_declaration): Likewise. diff --git a/src/parse-gram.y b/src/parse-gram.y index 1081f536..71f4829e 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -1,6 +1,6 @@ %{/* Bison Grammar Parser -*- C -*- - Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -346,24 +346,24 @@ symbol_def: } | ID { - symbol_class_set ($1, current_class, @1); + symbol_class_set ($1, current_class, @1, true); symbol_type_set ($1, current_type, @1); } | ID INT { - symbol_class_set ($1, current_class, @1); + symbol_class_set ($1, current_class, @1, true); symbol_type_set ($1, current_type, @1); symbol_user_token_number_set ($1, $2, @2); } | ID string_as_id { - symbol_class_set ($1, current_class, @1); + symbol_class_set ($1, current_class, @1, true); symbol_type_set ($1, current_type, @1); symbol_make_alias ($1, $2, @$); } | ID INT string_as_id { - symbol_class_set ($1, current_class, @1); + symbol_class_set ($1, current_class, @1, true); symbol_type_set ($1, current_type, @1); symbol_user_token_number_set ($1, $2, @2); symbol_make_alias ($1, $3, @$); @@ -441,7 +441,7 @@ string_as_id: STRING { $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1); - symbol_class_set ($$, token_sym, @1); + symbol_class_set ($$, token_sym, @1, false); } ; diff --git a/src/scan-gram.l b/src/scan-gram.l index cbb7b3de..718f297a 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -1,6 +1,6 @@ /* Bison Grammar Scanner -*- C -*- - Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -420,7 +420,7 @@ splice (\\[ \f\t\v]*\n)* val->symbol = symbol_get (quotearg_style (escape_quoting_style, last_string), *loc); - symbol_class_set (val->symbol, token_sym, *loc); + symbol_class_set (val->symbol, token_sym, *loc, false); last_string_1 = last_string[1]; symbol_user_token_number_set (val->symbol, last_string_1, *loc); STRING_FREE; diff --git a/src/symtab.c b/src/symtab.c index bf231628..1f2c17ee 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. @@ -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)"), @@ -182,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); } @@ -191,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++; @@ -202,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; + } } diff --git a/src/symtab.h b/src/symtab.h index 0f87c224..0f852b7a 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -1,6 +1,6 @@ /* Definitions for symtab.c and callers, part of Bison. - Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005 + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -79,6 +79,7 @@ struct symbol identifier-symbol pair for an alias. */ symbol *alias; symbol_class class; + bool declared; }; /* Undefined user number. */ @@ -121,7 +122,8 @@ void symbol_printer_set (symbol *sym, const char *printer, location loc); void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc); /* Set the CLASS associated with SYM. */ -void symbol_class_set (symbol *sym, symbol_class class, location loc); +void symbol_class_set (symbol *sym, symbol_class class, location loc, + bool declaring); /* Set the USER_TOKEN_NUMBER associated with SYM. */ void symbol_user_token_number_set (symbol *sym, int user_number, location loc);