]> git.saurik.com Git - bison.git/commitdiff
Handle string aliases for character tokens correctly.
authorJoel E. Denny <jdenny@ces.clemson.edu>
Mon, 14 Aug 2006 00:34:17 +0000 (00:34 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Mon, 14 Aug 2006 00:34:17 +0000 (00:34 +0000)
* src/symtab.c (symbol_user_token_number_set): If the token has an
alias, check and set its alias's user token number instead of its own,
which is set to indicate the alias.  Previously, every occurrence of
the character token in the grammar overwrote that alias indicator with
the character code.
* tests/input.at (String aliases for character tokens): New test.

ChangeLog
src/symtab.c
tests/input.at

index 6c2c571023703e8e0864e4b8f49369351948c4ba..99a0227b273d10181d1a1c00c30838f588c1f935 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-08-13  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Handle string aliases for character tokens correctly.
+       * src/symtab.c (symbol_user_token_number_set): If the token has an
+       alias, check and set its alias's user token number instead of its own,
+       which is set to indicate the alias.  Previously, every occurrence of
+       the character token in the grammar overwrote that alias indicator with
+       the character code.
+       * tests/input.at (String aliases for character tokens): New test.
+
 2006-08-12  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        * src/parse-gram.y: Add `%expect 0' so we don't overlook conflicts.
index 821ad56ccd8b13b366b2037d8b2c0ffd94172b56..8b3e30d37e0dd69b2f5376dc3325b8a66f003495 100644 (file)
@@ -287,13 +287,19 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
 void
 symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
 {
+  int *user_token_numberp;
+
   assert (sym->class == token_sym);
 
-  if (sym->user_token_number != USER_NUMBER_UNDEFINED
-      && sym->user_token_number != user_token_number)
+  if (sym->user_token_number != USER_NUMBER_ALIAS)
+    user_token_numberp = &sym->user_token_number;
+  else
+    user_token_numberp = &sym->alias->user_token_number;
+  if (*user_token_numberp != USER_NUMBER_UNDEFINED
+      && *user_token_numberp != user_token_number)
     complain_at (loc, _("redefining user token number of %s"), sym->tag);
 
-  sym->user_token_number = user_token_number;
+  *user_token_numberp = user_token_number;
   /* User defined $end token? */
   if (user_token_number == 0)
     {
index e50d99d8be03f560d32d24649f63664fb46d1c35..db73f0f4453f6a0dd978633daef565e0f1d10751 100644 (file)
@@ -471,3 +471,24 @@ AT_CHECK_REQUIRE(1.0, 0)
 AT_CHECK_REQUIRE(AT_PACKAGE_VERSION, 0)
 ## FIXME: Some day augment this version number.
 AT_CHECK_REQUIRE(100.0, 63)
+
+
+## ------------------------------------- ##
+## String aliases for character tokens.  ##
+## ------------------------------------- ##
+
+AT_SETUP([String aliases for character tokens])
+
+# Bison once thought a character token and its alias were different symbols
+# with the same user token number.
+
+AT_DATA_GRAMMAR([input.y],
+[[%token 'a' "a"
+%%
+start: 'a';
+%%
+]])
+
+AT_CHECK([bison -o input.c input.y])
+
+AT_CLEANUP