From 23c5a174534ac30c30c6fa2aa0c008c4846295a6 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 22 Apr 2002 08:22:11 +0000 Subject: [PATCH] * src/reader.c (token_translations_init): 256 is now the default value for the error token, i.e., it will be assigned another number if the user assigned 256 to one of her tokens. (reader): Don't force 256 to error. * doc/bison.texinfo (Symbols): Adjust. * tests/torture.at (AT_DATA_HORIZONTAL_GRAMMAR) (AT_DATA_TRIANGULAR_GRAMMAR): Number the tokens as 1, 2, 3 etc. instead of 10, 20, 30 (which was used to `jump' over error (256) and undefined (2)). --- ChangeLog | 12 ++++++++++++ NEWS | 10 ++++++++-- doc/bison.texinfo | 8 +++----- src/reader.c | 30 +++++++++++++++++++++++++----- tests/torture.at | 8 ++++---- 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1570a9e0..fe43e4cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2002-04-22 Akim Demaille + + * src/reader.c (token_translations_init): 256 is now the default + value for the error token, i.e., it will be assigned another + number if the user assigned 256 to one of her tokens. + (reader): Don't force 256 to error. + * doc/bison.texinfo (Symbols): Adjust. + * tests/torture.at (AT_DATA_HORIZONTAL_GRAMMAR) + (AT_DATA_TRIANGULAR_GRAMMAR): Number the tokens as 1, 2, 3 + etc. instead of 10, 20, 30 (which was used to `jump' over error + (256) and undefined (2)). + 2002-04-22 Akim Demaille Propagate more token_number_t. diff --git a/NEWS b/NEWS index f339c659..23d628ea 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,12 @@ Changes in version 1.49a: If yylex returned a code out of range, yyparse could die. This is no longer the case. +* Error token + According to POSIX, the error token should be numbered as 256. + Bison extends this requirement by making it a preference: *if* the + user specified that one of her tokens is numbered 256, then error + will be mapped onto another number. + * Large grammars Are now supported (large token numbers, large grammar size (= sum of the LHS and RHS lengths). @@ -19,11 +25,11 @@ Changes in version 1.49a: Bison used to play hacks with the initial rule, which the user does not write. It is now explicit, and visible in the reports and graphs as rule 0. - + * Useless rules are actually removed. Before, Bison reported the useless rules, but, although not used, included them in the parsers. - + * False `Token not used' report fixed. On a grammar such as diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 58186349..84a4ae8e 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -2218,11 +2218,9 @@ files before compiling them. The symbol @code{error} is a terminal symbol reserved for error recovery (@pxref{Error Recovery}); you shouldn't use it for any other purpose. -In particular, @code{yylex} should never return this value. -The default value of the error token is 256, so in the -unlikely event that you need to use a character token with numeric -value 256 you must reassign the error token's value with a -@code{%token} declaration. +In particular, @code{yylex} should never return this value. The default +value of the error token is 256, unless you explicitly assigned 256 to +one of your tokens with a @code{%token} declaration. @node Rules @section Syntax of Grammar Rules diff --git a/src/reader.c b/src/reader.c index da0744e5..6a99cfff 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1678,15 +1678,37 @@ read_additionnal_code (void) static void token_translations_init (void) { - int last_user_token_number = 256; + int num_256_available_p = TRUE; int i; - /* Set the user numbers. */ + /* Find the highest user token number, and whether 256, the POSIX + preferred user token number for the error token, is used. */ + max_user_token_number = 0; + for (i = 0; i < ntokens; ++i) + { + symbol_t *this = symbols[i]; + if (this->user_token_number != SUNDEF) + { + if (this->user_token_number > max_user_token_number) + max_user_token_number = this->user_token_number; + if (this->user_token_number == 256) + num_256_available_p = FALSE; + } + } + + /* If 256 is not used, assign it to error, to follow POSIX. */ + if (num_256_available_p && errtoken->user_token_number == SUNDEF) + errtoken->user_token_number = 256; + + /* Set the missing user numbers. */ + if (max_user_token_number < 256) + max_user_token_number = 256; + for (i = 0; i < ntokens; ++i) { symbol_t *this = symbols[i]; if (this->user_token_number == SUNDEF) - this->user_token_number = ++last_user_token_number; + this->user_token_number = ++max_user_token_number; if (this->user_token_number > max_user_token_number) max_user_token_number = this->user_token_number; } @@ -1698,7 +1720,6 @@ token_translations_init (void) inputs. */ for (i = 0; i < max_user_token_number + 1; i++) token_translations[i] = undeftoken->number; - symbols_do (symbol_translation, NULL); } @@ -1824,7 +1845,6 @@ reader (void) errtoken = getsym ("error"); errtoken->class = token_sym; errtoken->number = ntokens++; - errtoken->user_token_number = 256; /* Value specified by POSIX. */ /* Construct a token that represents all undefined literal tokens. It is always token number 2. */ diff --git a/tests/torture.at b/tests/torture.at index 24f1cada..deb5ab1d 100644 --- a/tests/torture.at +++ b/tests/torture.at @@ -60,7 +60,7 @@ EOF for my $size (1 .. $max) { - print "%token \"$size\" ", $size * 10, "\n"; + print "%token \"$size\" ", $size, "\n"; }; print < $max) return 0; else - return counter++ * 10; + return counter++; } static void -- 2.47.2