+2002-04-22 Akim Demaille <akim@epita.fr>
+
+ * 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 <akim@epita.fr>
Propagate more token_number_t.
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).
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
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
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;
}
inputs. */
for (i = 0; i < max_user_token_number + 1; i++)
token_translations[i] = undeftoken->number;
-
symbols_do (symbol_translation, NULL);
}
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. */
for my $size (1 .. $max)
{
- print "%token \"$size\" ", $size * 10, "\n";
+ print "%token \"$size\" ", $size, "\n";
};
print <<EOF;
++outer;
return END;
}
- return inner++ * 10;
+ return inner++;
}
static void
for my $size (1 .. $max)
{
- print "%token \"$size\" ", $size * 10, "\n";
+ print "%token \"$size\" ", $size, "\n";
};
print <<EOF;
if (counter > $max)
return 0;
else
- return counter++ * 10;
+ return counter++;
}
static void