mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-20 09:43:03 +00:00
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.
This commit is contained in:
@@ -1,5 +1,13 @@
|
|||||||
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:
|
* data/glr.c, data/glr.cc, data/lalr1.cc, data/yacc.c:
|
||||||
Allow multiple %union directives, whose contents concatenate.
|
Allow multiple %union directives, whose contents concatenate.
|
||||||
* src/parse-gram.y (grammar_declaration): Likewise.
|
* src/parse-gram.y (grammar_declaration): Likewise.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
%{/* 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.
|
||||||
|
|
||||||
@@ -346,24 +346,24 @@ symbol_def:
|
|||||||
}
|
}
|
||||||
| ID
|
| ID
|
||||||
{
|
{
|
||||||
symbol_class_set ($1, current_class, @1);
|
symbol_class_set ($1, current_class, @1, true);
|
||||||
symbol_type_set ($1, current_type, @1);
|
symbol_type_set ($1, current_type, @1);
|
||||||
}
|
}
|
||||||
| ID INT
|
| 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_type_set ($1, current_type, @1);
|
||||||
symbol_user_token_number_set ($1, $2, @2);
|
symbol_user_token_number_set ($1, $2, @2);
|
||||||
}
|
}
|
||||||
| ID string_as_id
|
| 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_type_set ($1, current_type, @1);
|
||||||
symbol_make_alias ($1, $2, @$);
|
symbol_make_alias ($1, $2, @$);
|
||||||
}
|
}
|
||||||
| ID INT string_as_id
|
| 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_type_set ($1, current_type, @1);
|
||||||
symbol_user_token_number_set ($1, $2, @2);
|
symbol_user_token_number_set ($1, $2, @2);
|
||||||
symbol_make_alias ($1, $3, @$);
|
symbol_make_alias ($1, $3, @$);
|
||||||
@@ -441,7 +441,7 @@ string_as_id:
|
|||||||
STRING
|
STRING
|
||||||
{
|
{
|
||||||
$$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
|
$$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
|
||||||
symbol_class_set ($$, token_sym, @1);
|
symbol_class_set ($$, token_sym, @1, false);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* 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.
|
||||||
|
|
||||||
@@ -420,7 +420,7 @@ splice (\\[ \f\t\v]*\n)*
|
|||||||
val->symbol = symbol_get (quotearg_style (escape_quoting_style,
|
val->symbol = symbol_get (quotearg_style (escape_quoting_style,
|
||||||
last_string),
|
last_string),
|
||||||
*loc);
|
*loc);
|
||||||
symbol_class_set (val->symbol, token_sym, *loc);
|
symbol_class_set (val->symbol, token_sym, *loc, false);
|
||||||
last_string_1 = last_string[1];
|
last_string_1 = last_string[1];
|
||||||
symbol_user_token_number_set (val->symbol, last_string_1, *loc);
|
symbol_user_token_number_set (val->symbol, last_string_1, *loc);
|
||||||
STRING_FREE;
|
STRING_FREE;
|
||||||
|
|||||||
21
src/symtab.c
21
src/symtab.c
@@ -1,7 +1,7 @@
|
|||||||
/* Symbol table manager for Bison.
|
/* Symbol table manager for Bison.
|
||||||
|
|
||||||
Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005 Free Software
|
Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006 Free
|
||||||
Foundation, Inc.
|
Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
@@ -65,6 +65,7 @@ symbol_new (uniqstr tag, location loc)
|
|||||||
|
|
||||||
res->alias = NULL;
|
res->alias = NULL;
|
||||||
res->class = unknown_sym;
|
res->class = unknown_sym;
|
||||||
|
res->declared = false;
|
||||||
|
|
||||||
if (nsyms == SYMBOL_NUMBER_MAXIMUM)
|
if (nsyms == SYMBOL_NUMBER_MAXIMUM)
|
||||||
fatal (_("too many symbols in input grammar (limit is %d)"),
|
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. */
|
/* 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
|
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)
|
if (class == nterm_sym && sym->class != nterm_sym)
|
||||||
sym->number = nvars++;
|
sym->number = nvars++;
|
||||||
@@ -202,6 +206,13 @@ symbol_class_set (symbol *sym, symbol_class class, location loc)
|
|||||||
sym->number = ntokens++;
|
sym->number = ntokens++;
|
||||||
|
|
||||||
sym->class = class;
|
sym->class = class;
|
||||||
|
|
||||||
|
if (declaring)
|
||||||
|
{
|
||||||
|
if (sym->declared)
|
||||||
|
warn_at (loc, _("symbol %s redeclared"), sym->tag);
|
||||||
|
sym->declared = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* 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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of Bison, the GNU Compiler Compiler.
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
@@ -79,6 +79,7 @@ struct symbol
|
|||||||
identifier-symbol pair for an alias. */
|
identifier-symbol pair for an alias. */
|
||||||
symbol *alias;
|
symbol *alias;
|
||||||
symbol_class class;
|
symbol_class class;
|
||||||
|
bool declared;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Undefined user number. */
|
/* 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);
|
void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
|
||||||
|
|
||||||
/* Set the CLASS associated with SYM. */
|
/* 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. */
|
/* Set the USER_TOKEN_NUMBER associated with SYM. */
|
||||||
void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
|
void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
|
||||||
|
|||||||
Reference in New Issue
Block a user