summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--src/reader.c3
-rw-r--r--src/symtab.c39
-rw-r--r--tests/regression.at32
-rw-r--r--tests/sets.at1
5 files changed, 54 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index 3a683551..3cc5679f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,27 @@
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
be used before its declaration.
* src/reader.c (check_and_convert_grammar): Don't invoke packgram if
@@ -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
- string literal): New test case.
+ string literal): New test cases.
(Characters Escapes, Web2c Actions): Declare string literals as
aliases.
* tests/sets.at (Firsts): Likewise.
diff --git a/src/reader.c b/src/reader.c
index e31fe4c5..5084618f 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -630,8 +630,7 @@ check_and_convert_grammar (void)
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);
diff --git a/src/symtab.c b/src/symtab.c
index 28f49fb4..37677ed7 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -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 (tag[0] != '"')
- nsyms++;
+ nsyms++;
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++;
- 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;
@@ -380,9 +378,6 @@ symbol_check_alias_consistency (symbol *this)
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;
@@ -720,13 +715,35 @@ symbols_token_translations_init (void)
void
symbols_pack (void)
{
- symbols = xcalloc (nsyms, sizeof *symbols);
-
symbols_do (symbol_check_alias_consistency_processor, NULL);
- if (complaint_issued)
- return;
+
+ symbols = xcalloc (nsyms, sizeof *symbols);
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)
diff --git a/tests/regression.at b/tests/regression.at
index 1c5ccbbf..36b95eb1 100644
--- a/tests/regression.at
+++ b/tests/regression.at
@@ -489,9 +489,7 @@ AT_DATA_GRAMMAR([input.y],
void yyerror (const char *s);
int yylex (void);
%}
-[%token QUOTES "\""
-%token TICK "'"
-%%
+[%%
exp:
'\'' "\'"
| '\"' "\""
@@ -702,10 +700,6 @@ statement: struct_stat;
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
-# uses.
+# uses and other tokens appeared in between.
AT_DATA([input.y],
[[%%
@@ -1137,25 +1131,3 @@ start: 'a' "A" 'b';
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
diff --git a/tests/sets.at b/tests/sets.at
index 941d0cc2..a731315b 100644
--- a/tests/sets.at
+++ b/tests/sets.at
@@ -196,7 +196,6 @@ AT_DATA([input.y],
[[%nonassoc '<' '>'
%left '+' '-'
%right '^' '='
-%token EXP "exp"
%%
exp:
exp '<' exp