]> git.saurik.com Git - bison.git/commitdiff
* src/assoc.c, src/asssoc.h (assoc_t, assoc_to_string): New.
authorAkim Demaille <akim@epita.fr>
Tue, 16 Jul 2002 14:04:06 +0000 (14:04 +0000)
committerAkim Demaille <akim@epita.fr>
Tue, 16 Jul 2002 14:04:06 +0000 (14:04 +0000)
Adjust all former `associativity' dependencies.
* src/symtab.c (symbol_new): Default associativity is `undef', not
`right'.
(symbol_check_alias_consistence): Adjust.

ChangeLog
src/Makefile.am
src/assoc.c [new file with mode: 0644]
src/assoc.h [new file with mode: 0644]
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/symtab.c
src/symtab.h

index 7d942691313b453fe7914873254f1c7c66dfdb3c..a903fdd65629fee8410334382bb6e1062778d378 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2002-07-16  Akim Demaille  <akim@epita.fr>
+
+       * src/assoc.c, src/asssoc.h (assoc_t, assoc_to_string): New.
+       Adjust all former `associativity' dependencies.
+       * src/symtab.c (symbol_new): Default associativity is `undef', not
+       `right'.
+       (symbol_check_alias_consistence): Adjust.
+
 2002-07-09  Akim Demaille  <akim@epita.fr>
 
        * doc/bison.texinfo: Properly set the ``header'' part.
 2002-07-09  Akim Demaille  <akim@epita.fr>
 
        * doc/bison.texinfo: Properly set the ``header'' part.
index c3edda8db64a969e53088ffbb913ea2647b0a9a2..f46d032bb6cc1637bfe51ffcf44a27333b18e932 100644 (file)
@@ -37,6 +37,7 @@ bin_PROGRAMS = bison
 
 bison_SOURCES =                                  \
        LR0.c LR0.h                               \
 
 bison_SOURCES =                                  \
        LR0.c LR0.h                               \
+       assoc.c assoc.h                           \
        closure.c closure.h                       \
        complain.c complain.h                     \
        conflicts.c conflicts.h                   \
        closure.c closure.h                       \
        complain.c complain.h                     \
        conflicts.c conflicts.h                   \
diff --git a/src/assoc.c b/src/assoc.c
new file mode 100644 (file)
index 0000000..226a351
--- /dev/null
@@ -0,0 +1,43 @@
+/* Associativity information.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   Bison is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Bison is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bison; see the file COPYING.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "system.h"
+#include "assoc.h"
+
+
+const char *
+assoc_to_string (assoc_t assoc)
+{
+  switch (assoc)
+    {
+    case undef_assoc:
+      return "undefined associativity";
+
+    case right_assoc:
+      return "%right";
+
+    case left_assoc:
+      return "%left";
+
+    case non_assoc:
+      return "%nonassoc";
+    }
+  return NULL;
+}
diff --git a/src/assoc.h b/src/assoc.h
new file mode 100644 (file)
index 0000000..dd62e19
--- /dev/null
@@ -0,0 +1,35 @@
+/* Associativity information.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   Bison is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   Bison is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bison; see the file COPYING.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef ASSOC_H_
+# define ASSOC_H_
+
+/* Associativity values for tokens and rules.  */
+typedef enum
+{
+  undef_assoc,
+  right_assoc,
+  left_assoc,
+  non_assoc
+} assoc_t;
+
+const char *assoc_to_string PARAMS ((assoc_t assoc));
+
+#endif /* !ASSOC_H_ */
index 175ca0f9c84673ac326ee92b31f6c7105f37e39a..45c723866bc7fb8f6927037b3a2c6ad3dd8f07ac 100644 (file)
@@ -105,7 +105,7 @@ symbol_class current_class = unknown_sym;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
-associativity current_assoc;
+assoc_t current_assoc;
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 
@@ -231,7 +231,7 @@ typedef union {
   symbol_list_t *list;
   int integer;
   char *string;
   symbol_list_t *list;
   int integer;
   char *string;
-  associativity assoc;
+  assoc_t assoc;
 } yystype;
 /* Line 187 of /usr/local/share/bison/yacc.c.  */
 #line 238 "parse-gram.c"
 } yystype;
 /* Line 187 of /usr/local/share/bison/yacc.c.  */
 #line 238 "parse-gram.c"
index fc18e77d575b4268fa8b81c882cc1c2daa2ea9b3..d8939d291de283108f676120cbadee82a66ccee3 100644 (file)
@@ -134,7 +134,7 @@ typedef union {
   symbol_list_t *list;
   int integer;
   char *string;
   symbol_list_t *list;
   int integer;
   char *string;
-  associativity assoc;
+  assoc_t assoc;
 } yystype;
 /* Line 1271 of /usr/local/share/bison/yacc.c.  */
 #line 141 "y.tab.h"
 } yystype;
 /* Line 1271 of /usr/local/share/bison/yacc.c.  */
 #line 141 "y.tab.h"
index c29bc529e780021f4283b8727d4752d474a41107..d777daec45ed1dbfb417c49d3f66154f80c8c06f 100644 (file)
@@ -78,7 +78,7 @@ symbol_class current_class = unknown_sym;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
-associativity current_assoc;
+assoc_t current_assoc;
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 %}
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 %}
@@ -91,7 +91,7 @@ braced_code_t current_braced_code = action_braced_code;
   symbol_list_t *list;
   int integer;
   char *string;
   symbol_list_t *list;
   int integer;
   char *string;
-  associativity assoc;
+  assoc_t assoc;
 };
 
 /* Define the tokens together with there human representation. */
 };
 
 /* Define the tokens together with there human representation. */
index afc0c1c8b52a0657ab0d072448164510bd75a60c..ef03b28461d5b842f853e5af19f4f0e2470fbb54 100644 (file)
@@ -55,7 +55,7 @@ symbol_new (const char *tag, location_t location)
 
   res->number = NUMBER_UNDEFINED;
   res->prec = 0;
 
   res->number = NUMBER_UNDEFINED;
   res->prec = 0;
-  res->assoc = right_assoc;
+  res->assoc = undef_assoc;
   res->user_token_number = USER_NUMBER_UNDEFINED;
 
   res->alias = NULL;
   res->user_token_number = USER_NUMBER_UNDEFINED;
 
   res->alias = NULL;
@@ -129,7 +129,7 @@ symbol_printer_set (symbol_t *symbol, char *printer, location_t location)
 
 void
 symbol_precedence_set (symbol_t *symbol,
 
 void
 symbol_precedence_set (symbol_t *symbol,
-                      int prec, associativity assoc, location_t location)
+                      int prec, assoc_t assoc, location_t location)
 {
   if (assoc != undef_assoc)
     {
 {
   if (assoc != undef_assoc)
     {
@@ -288,15 +288,12 @@ symbol_check_alias_consistence (symbol_t *this)
 
       if (this->assoc != this->alias->assoc)
        {
 
       if (this->assoc != this->alias->assoc)
        {
-         /* FIXME: For some reason (probably the S/R => keep the S),
-            the right assoc is chosen has the ``not set''.  This is
-            not nice, fix this!  */
-         if (this->assoc != right_assoc
-             && this->alias->assoc != right_assoc)
+         if (this->assoc != undef_assoc && this->alias->assoc != undef_assoc)
            complain_at (this->alias->location,
            complain_at (this->alias->location,
-                        _("conflicting associativities for %s and %s"),
-                        this->tag, this->alias->tag);
-         if (this->assoc != 0)
+                        _("conflicting associativities for %s (%s) and %s (%s)"),
+                        this->tag, assoc_to_string (this->assoc),
+                        this->alias->tag, assoc_to_string (this->alias->assoc));
+         if (this->assoc != undef_assoc)
            this->alias->assoc = this->assoc;
          else
            this->assoc = this->alias->assoc;
            this->alias->assoc = this->assoc;
          else
            this->assoc = this->alias->assoc;
index 4dd463f37b902ff3634c58993a18bf8d1fd45339..5abe38963ec92128bfad0b0fec72494de8fe9442 100644 (file)
 # define SYMTAB_H_
 
 # include "location.h"
 # define SYMTAB_H_
 
 # include "location.h"
+# include "assoc.h"
 
 /*----------.
 | Symbols.  |
 `----------*/
 
 
 /*----------.
 | Symbols.  |
 `----------*/
 
-/* Associativity values for tokens and rules.  */
-typedef enum
-{
-  undef_assoc,
-  right_assoc,
-  left_assoc,
-  non_assoc
-} associativity;
-
-
 /* Symbol classes.  */
 typedef enum
 {
 /* Symbol classes.  */
 typedef enum
 {
@@ -68,7 +59,7 @@ struct symbol_s
 
   symbol_number_t number;
   short prec;
 
   symbol_number_t number;
   short prec;
-  associativity assoc;
+  assoc_t assoc;
   int user_token_number;
 
   /* Points to the other in the identifier-symbol pair for an alias.
   int user_token_number;
 
   /* Points to the other in the identifier-symbol pair for an alias.
@@ -118,7 +109,7 @@ void symbol_printer_set PARAMS ((symbol_t *symbol,
 /* Set the PRECEDENCE associated to SYMBOL.  Ensures that SYMBOL is a
    terminal.  Does nothing if invoked with UNDEF_ASSOC as ASSOC.  */
 void symbol_precedence_set PARAMS ((symbol_t *symbol,
 /* Set the PRECEDENCE associated to SYMBOL.  Ensures that SYMBOL is a
    terminal.  Does nothing if invoked with UNDEF_ASSOC as ASSOC.  */
 void symbol_precedence_set PARAMS ((symbol_t *symbol,
-                                   int prec, associativity assoc,
+                                   int prec, assoc_t assoc,
                                    location_t location));
 
 /* Set the CLASS associated to SYMBOL.  */
                                    location_t location));
 
 /* Set the CLASS associated to SYMBOL.  */