bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bison parse-gram.y token


From: Paul Eggert
Subject: Re: bison parse-gram.y token
Date: Tue, 03 Jan 2006 13:32:53 -0800
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

twlevo <address@hidden> writes:

> parse-gram.y %token statements
>
>
> %token TOKEN
> TOKEN
>
> %%
>
> start:
>  ;
>  
> %%
>
> this sets 1 symbol `TOKEN' in yytname[]
> no messages on multiple similar defines.

Thanks for reporting that.  I installed this patch.

2006-01-03  Paul Eggert  <address@hidden>

        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.

Index: src/parse-gram.y
===================================================================
RCS file: /cvsroot/bison/bison/src/parse-gram.y,v
retrieving revision 1.66
diff -p -u -r1.66 parse-gram.y
--- src/parse-gram.y    3 Jan 2006 20:25:54 -0000       1.66
+++ src/parse-gram.y    3 Jan 2006 21:28:19 -0000
@@ -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);
     }
 ;
 
Index: src/scan-gram.l
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-gram.l,v
retrieving revision 1.81
diff -p -u -r1.81 scan-gram.l
--- src/scan-gram.l     28 Dec 2005 08:45:47 -0000      1.81
+++ src/scan-gram.l     3 Jan 2006 21:28:19 -0000
@@ -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;
Index: src/symtab.c
===================================================================
RCS file: /cvsroot/bison/bison/src/symtab.c,v
retrieving revision 1.68
diff -p -u -r1.68 symtab.c
--- src/symtab.c        22 Dec 2005 11:40:05 -0000      1.68
+++ src/symtab.c        3 Jan 2006 21:28:19 -0000
@@ -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 
     }
 
   /* 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 
 `------------------------------------*/
 
 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_cl
     sym->number = ntokens++;
 
   sym->class = class;
+
+  if (declaring)
+    {
+      if (sym->declared)
+       warn_at (loc, _("symbol %s redeclared"), sym->tag);
+      sym->declared = true;
+    }
 }
 
 
Index: src/symtab.h
===================================================================
RCS file: /cvsroot/bison/bison/src/symtab.h,v
retrieving revision 1.58
diff -p -u -r1.58 symtab.h
--- src/symtab.h        16 Sep 2005 19:50:08 -0000      1.58
+++ src/symtab.h        3 Jan 2006 21:28:19 -0000
@@ -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, co
 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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]