]> git.saurik.com Git - bison.git/commitdiff
Redo some of the previous commit: add back the ability to use
authorJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 18 Aug 2006 21:43:18 +0000 (21:43 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Fri, 18 Aug 2006 21:43:18 +0000 (21:43 +0000)
non-aliased/undeclared string literals since it might be useful to
those declaring %token-table.
* src/reader.c (check_and_convert_grammar): Undo changes in previous
commit: don't worry about complaints from symbols_pack.
* src/symtab.c (symbol_new, symbol_class_set,
symbol_check_alias_consistency): Undo changes in previous commit: count         each string literal as a new symbol and token, assign it a symbol
number, and don't complain about non-aliased string literals.
(symbols_pack): Since symbol_make_alias still does not decrement symbol
and token counts but does still set aliased tokens to the same number,
symbol_pack_processor now leaves empty slots in the symbols array.
Remove those slots.
* tests/regression.at (Undeclared string literal): Remove test case
added in previous commit since non-aliased string literals are allowed
again.
(Characters Escapes, Web2c Actions): Undo changes in previous commit:
remove unnecessary string literal declarations.
* tests/sets.at (Firsts): Likewise.

ChangeLog
src/reader.c
src/symtab.c
tests/regression.at
tests/sets.at

index 3a683551af51aa2e672a215285b1d303b8880fa5..3cc5679f04bcfeb38a53a548d7d2206e0df03fcd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2006-08-18  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Redo some of the previous commit: add back the ability to use
+       non-aliased/undeclared string literals since it might be useful to
+       those declaring %token-table.
+       * src/reader.c (check_and_convert_grammar): Undo changes in previous
+       commit: don't worry about complaints from symbols_pack.
+       * src/symtab.c (symbol_new, symbol_class_set,
+       symbol_check_alias_consistency): Undo changes in previous commit: count
+       each string literal as a new symbol and token, assign it a symbol
+       number, and don't complain about non-aliased string literals.
+       (symbols_pack): Since symbol_make_alias still does not decrement symbol
+       and token counts but does still set aliased tokens to the same number,
+       symbol_pack_processor now leaves empty slots in the symbols array.
+       Remove those slots.
+       * tests/regression.at (Undeclared string literal): Remove test case
+       added in previous commit since non-aliased string literals are allowed
+       again.
+       (Characters Escapes, Web2c Actions): Undo changes in previous commit:
+       remove unnecessary string literal declarations.
+       * tests/sets.at (Firsts): Likewise.
+
 2006-08-18  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Don't allow an undeclared string literal, but allow a string literal to
 2006-08-18  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Don't allow an undeclared string literal, but allow a string literal to
@@ -18,7 +40,7 @@
        symbol_pack asserts that every token has been assigned a symbol number
        although undeclared string literals have not.
        * tests/regression.at (String alias declared after use, Undeclared
        symbol_pack asserts that every token has been assigned a symbol number
        although undeclared string literals have not.
        * tests/regression.at (String alias declared after use, Undeclared
-       string literal): New test case.
+       string literal): New test cases.
        (Characters Escapes, Web2c Actions): Declare string literals as
        aliases.
        * tests/sets.at (Firsts): Likewise.
        (Characters Escapes, Web2c Actions): Declare string literals as
        aliases.
        * tests/sets.at (Firsts): Likewise.
index e31fe4c5dc4ece1b0e7f8cadbd42b60814a30362..5084618ffb4a5ba465db4dce995620e32ea84574 100644 (file)
@@ -630,8 +630,7 @@ check_and_convert_grammar (void)
   symbols_pack ();
 
   /* Convert the grammar into the format described in gram.h.  */
   symbols_pack ();
 
   /* Convert the grammar into the format described in gram.h.  */
-  if (!complaint_issued)
-    packgram ();
+  packgram ();
 
   /* The grammar as a symbol_list is no longer needed. */
   LIST_FREE (symbol_list, grammar);
 
   /* The grammar as a symbol_list is no longer needed. */
   LIST_FREE (symbol_list, grammar);
index 28f49fb4b72cb8f55a8bfb1e44286450304d5708..37677ed72f8f823a760e14fe99a99f33f002f761 100644 (file)
@@ -79,8 +79,7 @@ symbol_new (uniqstr tag, location loc)
   if (nsyms == SYMBOL_NUMBER_MAXIMUM)
     fatal (_("too many symbols in input grammar (limit is %d)"),
           SYMBOL_NUMBER_MAXIMUM);
   if (nsyms == SYMBOL_NUMBER_MAXIMUM)
     fatal (_("too many symbols in input grammar (limit is %d)"),
           SYMBOL_NUMBER_MAXIMUM);
-  if (tag[0] != '"')
-    nsyms++;
+  nsyms++;
   return res;
 }
 
   return res;
 }
 
@@ -267,8 +266,7 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
 
   if (class == nterm_sym && sym->class != nterm_sym)
     sym->number = nvars++;
 
   if (class == nterm_sym && sym->class != nterm_sym)
     sym->number = nvars++;
-  else if (class == token_sym && sym->number == NUMBER_UNDEFINED
-           && sym->tag[0] != '"')
+  else if (class == token_sym && sym->number == NUMBER_UNDEFINED)
     sym->number = ntokens++;
 
   sym->class = class;
     sym->number = ntokens++;
 
   sym->class = class;
@@ -380,9 +378,6 @@ symbol_check_alias_consistency (symbol *this)
   symbol *alias = this;
   symbol *orig  = this->alias;
 
   symbol *alias = this;
   symbol *orig  = this->alias;
 
-  if (this->tag[0] == '"' && !this->alias)
-    complain_at (this->location, _("%s undeclared"), this->tag);
-
   /* Check only those that _are_ the aliases.  */
   if (!(this->alias && this->user_token_number == USER_NUMBER_ALIAS))
     return;
   /* Check only those that _are_ the aliases.  */
   if (!(this->alias && this->user_token_number == USER_NUMBER_ALIAS))
     return;
@@ -720,13 +715,35 @@ symbols_token_translations_init (void)
 void
 symbols_pack (void)
 {
 void
 symbols_pack (void)
 {
-  symbols = xcalloc (nsyms, sizeof *symbols);
-
   symbols_do (symbol_check_alias_consistency_processor, NULL);
   symbols_do (symbol_check_alias_consistency_processor, NULL);
-  if (complaint_issued)
-    return;
+
+  symbols = xcalloc (nsyms, sizeof *symbols);
   symbols_do (symbol_pack_processor, NULL);
 
   symbols_do (symbol_pack_processor, NULL);
 
+  /* Aliases leave empty slots in symbols, so remove them.  */
+  {
+    int writei;
+    int readi;
+    int nsyms_old = nsyms;
+    for (writei = 0, readi = 0; readi < nsyms_old; readi += 1)
+      {
+        if (symbols[readi] == NULL)
+          {
+            nsyms -= 1;
+            ntokens -= 1;
+          }
+        else
+          {
+            symbols[writei] = symbols[readi];
+            symbols[writei]->number = writei;
+            if (symbols[writei]->alias)
+              symbols[writei]->alias->number = writei;
+            writei += 1;
+          }
+      }
+  }
+  symbols = xnrealloc (symbols, nsyms, sizeof *symbols);
+
   symbols_token_translations_init ();
 
   if (startsymbol->class == unknown_sym)
   symbols_token_translations_init ();
 
   if (startsymbol->class == unknown_sym)
index 1c5ccbbf370766306713828ff23c5d6d2f1ee7dd..36b95eb102c3e89241243038c8fe22b18b902e5f 100644 (file)
@@ -489,9 +489,7 @@ AT_DATA_GRAMMAR([input.y],
 void yyerror (const char *s);
 int yylex (void);
 %}
 void yyerror (const char *s);
 int yylex (void);
 %}
-[%token QUOTES "\""
-%token TICK "'"
-%%
+[%%
 exp:
   '\'' "\'"
 | '\"' "\""
 exp:
   '\'' "\'"
 | '\"' "\""
@@ -702,10 +700,6 @@ statement:  struct_stat;
 struct_stat:  /* empty. */ | if else;
 if: "if" "const" "then" statement;
 else: "else" statement;
 struct_stat:  /* empty. */ | if else;
 if: "if" "const" "then" statement;
 else: "else" statement;
-%token IF "if";
-%token CONST "const";
-%token THEN "then";
-%token ELSE "else";
 %%
 ]])
 
 %%
 ]])
 
@@ -1126,7 +1120,7 @@ AT_SETUP([String alias declared after use])
 # Bison once incorrectly asserted that the symbol number for either a token or
 # its alias was the highest symbol number so far at the point of the alias
 # declaration.  That was true unless the declaration appeared after their first
 # Bison once incorrectly asserted that the symbol number for either a token or
 # its alias was the highest symbol number so far at the point of the alias
 # declaration.  That was true unless the declaration appeared after their first
-# uses.
+# uses and other tokens appeared in between.
 
 AT_DATA([input.y],
 [[%%
 
 AT_DATA([input.y],
 [[%%
@@ -1137,25 +1131,3 @@ start: 'a' "A" 'b';
 AT_CHECK([bison -t -o input.c input.y])
 
 AT_CLEANUP
 AT_CHECK([bison -t -o input.c input.y])
 
 AT_CLEANUP
-
-
-
-## --------------------------- ##
-## Undeclared string literal.  ##
-## --------------------------- ##
-
-AT_SETUP([Undeclared string literal])
-
-# Bison once allowed a string literal to be used in the grammar without any
-# declaration assigning it as an alias of another token.
-
-AT_DATA([input.y],
-[[%%
-start: "abc";
-]])
-
-AT_CHECK([bison -t -o input.c input.y], [1], [],
-[[input.y:2.8-12: "abc" undeclared
-]])
-
-AT_CLEANUP
index 941d0cc257a42d7c0f30e2d705995019e1905c63..a731315b231e06386a62f5e5e8cd6f3565e93b85 100644 (file)
@@ -196,7 +196,6 @@ AT_DATA([input.y],
 [[%nonassoc '<' '>'
 %left '+' '-'
 %right '^' '='
 [[%nonassoc '<' '>'
 %left '+' '-'
 %right '^' '='
-%token EXP "exp"
 %%
 exp:
    exp '<' exp
 %%
 exp:
    exp '<' exp