* 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>
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.
* 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 -*-
%{/* 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.
This file is part of Bison, the GNU Compiler Compiler.
- 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_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_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_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, @$);
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);
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 -*-
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
val->symbol = symbol_get (quotearg_style (escape_quoting_style,
last_string),
*loc);
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;
last_string_1 = last_string[1];
symbol_user_token_number_set (val->symbol, last_string_1, *loc);
STRING_FREE;
/* Symbol table manager for Bison.
/* 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.
This file is part of Bison, the GNU Compiler Compiler.
res->alias = NULL;
res->class = unknown_sym;
res->alias = NULL;
res->class = unknown_sym;
if (nsyms == SYMBOL_NUMBER_MAXIMUM)
fatal (_("too many symbols in input grammar (limit is %d)"),
if (nsyms == SYMBOL_NUMBER_MAXIMUM)
fatal (_("too many symbols in input grammar (limit is %d)"),
}
/* Only terminals have a precedence. */
}
/* Only terminals have a precedence. */
- symbol_class_set (sym, token_sym, loc);
+ symbol_class_set (sym, token_sym, loc, false);
`------------------------------------*/
void
`------------------------------------*/
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)
{
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++;
if (class == nterm_sym && sym->class != nterm_sym)
sym->number = nvars++;
sym->number = ntokens++;
sym->class = class;
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.
/* 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.
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;
identifier-symbol pair for an alias. */
symbol *alias;
symbol_class class;
};
/* Undefined user number. */
};
/* Undefined user number. */
void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
/* Set the CLASS associated with SYM. */
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);
/* Set the USER_TOKEN_NUMBER associated with SYM. */
void symbol_user_token_number_set (symbol *sym, int user_number, location loc);