From: Joel E. Denny Date: Mon, 14 Aug 2006 00:34:17 +0000 (+0000) Subject: Handle string aliases for character tokens correctly. X-Git-Tag: v2.3b~312 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/1f6b3679b2f6eb9d5a7643e2b62f0f2939677be5 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. --- diff --git a/ChangeLog b/ChangeLog index 6c2c5710..99a0227b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-08-13 Joel E. Denny + + 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 * src/parse-gram.y: Add `%expect 0' so we don't overlook conflicts. diff --git a/src/symtab.c b/src/symtab.c index 821ad56c..8b3e30d3 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -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) { diff --git a/tests/input.at b/tests/input.at index e50d99d8..db73f0f4 100644 --- a/tests/input.at +++ b/tests/input.at @@ -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