* 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.
2006-01-03 Paul Eggert <eggert@cs.ucla.edu>
+ 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.
%{/* 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.
}
| 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, @$);
STRING
{
$$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
- symbol_class_set ($$, token_sym, @1);
+ symbol_class_set ($$, token_sym, @1, false);
}
;
/* 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.
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;
/* 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.
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)"),
}
/* Only terminals have a precedence. */
- symbol_class_set (sym, token_sym, loc);
+ symbol_class_set (sym, token_sym, loc, false);
}
`------------------------------------*/
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++;
sym->number = ntokens++;
sym->class = class;
+
+ if (declaring)
+ {
+ if (sym->declared)
+ warn_at (loc, _("symbol %s redeclared"), sym->tag);
+ sym->declared = true;
+ }
}
/* 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.
identifier-symbol pair for an alias. */
symbol *alias;
symbol_class class;
+ bool declared;
};
/* Undefined user number. */
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);