From 6d0ef4ec2078687dc9217ae51eea397ce7443a3d Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Fri, 18 Aug 2006 21:43:18 +0000 Subject: [PATCH] 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. --- ChangeLog | 24 +++++++++++++++++++++++- src/reader.c | 3 +-- src/symtab.c | 39 ++++++++++++++++++++++++++++----------- tests/regression.at | 32 ++------------------------------ tests/sets.at | 1 - 5 files changed, 54 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3a683551..3cc5679f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2006-08-18 Joel E. Denny + + 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 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 - 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 -- 2.45.2