]> git.saurik.com Git - bison.git/commitdiff
* src/reader.c (token_translations_init): 256 is now the default
authorAkim Demaille <akim@epita.fr>
Mon, 22 Apr 2002 08:22:11 +0000 (08:22 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 22 Apr 2002 08:22:11 +0000 (08:22 +0000)
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
NEWS
doc/bison.texinfo
src/reader.c
tests/torture.at

index 1570a9e03a6fed689e1846dbbde8985c52378047..fe43e4cbff49424db185dd3a36f364cdbd6d726a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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.
diff --git a/NEWS b/NEWS
index f339c6591ae89594ff936804f83bb849d3288ca8..23d628ea525f5d5aa21ac953d186ed9b8c9af297 100644 (file)
--- 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
 
index 58186349d5f5c7264e0909309fc429c0f5047b2d..84a4ae8ebdb9fcdf58a7c7dff84e1380d2665d86 100644 (file)
@@ -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
index da0744e535526a0d48145fc0e082a7e829e7a42b..6a99cfffa79e0b57ceaeb46c3562a6c28710b639 100644 (file)
@@ -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.  */
index 24f1cada7812db98ad1df1ecfde30f3824702642..deb5ab1d178726fe37115c472b776e25e9d6e9ff 100644 (file)
@@ -60,7 +60,7 @@ EOF
 
 for my $size (1 .. $max)
   {
-    print "%token \"$size\" ", $size * 10, "\n";
+    print "%token \"$size\" ", $size, "\n";
   };
 
 print <<EOF;
@@ -100,7 +100,7 @@ yylex (void)
       ++outer;
       return END;
     }
-  return inner++ * 10;
+  return inner++;
 }
 
 static void
@@ -170,7 +170,7 @@ EOF
 
 for my $size (1 .. $max)
   {
-    print "%token \"$size\" ", $size * 10, "\n";
+    print "%token \"$size\" ", $size, "\n";
   };
 
 print <<EOF;
@@ -192,7 +192,7 @@ yylex (void)
   if (counter > $max)
     return 0;
   else
-  return counter++ * 10;
+  return counter++;
 }
 
 static void