Split the default %destructor/%printer into two kinds: <*> and <!>.

Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00060.html>.
* NEWS (2.3a+): Mention.
* doc/bison.texinfo (Freeing Discarded Symbols): Document this and the
previous change today related to mid-rules.
(Bison Symbols): Remove %symbol-default and add <*> and <!>.
* src/parser-gram.y (PERCENT_SYMBOL_DEFAULT): Remove.
(TYPE_TAG_ANY): Add as <*>.
(TYPE_TAG_NONE): Add as <!>.
(generic_symlist_item): Remove RHS for %symbol-default and add RHS's
for <*> and <!>.
* src/scan-gram.l (PERCENT_SYMBOL_DEFAULT): Remove.
(TYPE_TAG_ANY, TYPE_TAG_NONE): Add.
* src/symlist.c (symbol_list_default_new): Split into tagged and
tagless versions.
(symbol_list_destructor_set, symbol_list_printer_set): Split
SYMLIST_DEFAULT case into SYMLIST_DEFAULT_TAGGED and
SYMLIST_DEFAULT_TAGLESS.
* src/symlist.h: Update symbol_list_default*_new prototypes.
(symbol_list.content_type): Split enum value SYMLIST_DEFAULT into
SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS.
* src/symtab.c (default_destructor, default_destructor_location,
default_printer, default_printer_location): Split each into tagged and
tagless versions.
(symbol_destructor_get, symbol_destructor_location_get,
symbol_printer_get, symbol_printer_location_get): Implement tagged
default and tagless default cases.
(default_destructor_set, default_printer_set): Split each into tagged
and tagless versions.
* src/symtab.h: Update prototypes.
* tests/actions.at (Default %printer and %destructor): Rename to...
(Default tagless %printer and %destructor): ... this, and extend.
(Per-type %printer and %destructor): Rename to...
(Default tagged and per-type %printer and %destructor): ... this, and
extend.
(Default %printer and %destructor for user-defined end token): Extend.
(Default %printer and %destructor are not for error or $undefined):
Update.
(Default %printer and %destructor are not for $accept): Update.
(Default %printer and %destructor for mid-rule values): Extend.
* tests/input.at (Default %printer and %destructor redeclared): Extend.
(Unused values with default %destructor): Extend.
This commit is contained in:
Joel E. Denny
2006-10-21 10:03:35 +00:00
parent f91b162944
commit 12e3584054
13 changed files with 870 additions and 602 deletions

View File

@@ -41,14 +41,19 @@ symbol *accept = NULL;
symbol *startsymbol = NULL;
location startsymbol_location;
/*-----------------------------------.
| Default %destructor and %printer. |
`-----------------------------------*/
/*---------------------------------------.
| Default %destructor's and %printer's. |
`---------------------------------------*/
static const char *default_destructor = NULL;
static location default_destructor_location;
static const char *default_printer = NULL;
static location default_printer_location;
static const char *default_tagged_destructor = NULL;
static location default_tagged_destructor_location;
static const char *default_tagless_destructor = NULL;
static location default_tagless_destructor_location;
static const char *default_tagged_printer = NULL;
static location default_tagged_printer_location;
static const char *default_tagless_printer = NULL;
static location default_tagless_printer_location;
/*---------------------------------.
| Create a new symbol, named TAG. |
@@ -220,10 +225,13 @@ symbol_destructor_get (symbol *sym)
return type->destructor;
}
/* Apply the default %destructor only to user-defined symbols. */
/* Apply default %destructor's only to user-defined symbols. */
if (sym->tag[0] == '$' || sym == errtoken)
return NULL;
return default_destructor;
if (sym->type_name)
return default_tagged_destructor;
return default_tagless_destructor;
}
/*---------------------------------------------------------------.
@@ -240,8 +248,9 @@ symbol_destructor_location_get (symbol *sym)
semantic_type *type = semantic_type_get (sym->type_name);
if (type->destructor)
return type->destructor_location;
return default_tagged_destructor_location;
}
return default_destructor_location;
return default_tagless_destructor_location;
}
/*---------------------------------------------------------------.
@@ -300,7 +309,10 @@ symbol_printer_get (symbol *sym)
/* Apply the default %printer only to user-defined symbols. */
if (sym->tag[0] == '$' || sym == errtoken)
return NULL;
return default_printer;
if (sym->type_name)
return default_tagged_printer;
return default_tagless_printer;
}
/*------------------------------------------------------------.
@@ -317,8 +329,9 @@ symbol_printer_location_get (symbol *sym)
semantic_type *type = semantic_type_get (sym->type_name);
if (type->printer)
return type->printer_location;
return default_tagged_printer_location;
}
return default_printer_location;
return default_tagless_printer_location;
}
@@ -924,30 +937,58 @@ symbols_pack (void)
}
/*-----------------------------------.
| Set default %destructor/%printer. |
`-----------------------------------*/
/*--------------------------------------------------.
| Set default tagged/tagless %destructor/%printer. |
`--------------------------------------------------*/
void
default_destructor_set (const char *destructor, location loc)
default_tagged_destructor_set (const char *destructor, location loc)
{
if (default_destructor != NULL)
if (default_tagged_destructor != NULL)
{
complain_at (loc, _("redeclaration for default %%destructor"));
complain_at (default_destructor_location, _("previous declaration"));
complain_at (loc, _("redeclaration for default tagged %%destructor"));
complain_at (default_tagged_destructor_location,
_("previous declaration"));
}
default_destructor = destructor;
default_destructor_location = loc;
default_tagged_destructor = destructor;
default_tagged_destructor_location = loc;
}
void
default_printer_set (const char *printer, location loc)
default_tagless_destructor_set (const char *destructor, location loc)
{
if (default_printer != NULL)
if (default_tagless_destructor != NULL)
{
complain_at (loc, _("redeclaration for default %%printer"));
complain_at (default_printer_location, _("previous declaration"));
complain_at (loc, _("redeclaration for default tagless %%destructor"));
complain_at (default_tagless_destructor_location,
_("previous declaration"));
}
default_printer = printer;
default_printer_location = loc;
default_tagless_destructor = destructor;
default_tagless_destructor_location = loc;
}
void
default_tagged_printer_set (const char *printer, location loc)
{
if (default_tagged_printer != NULL)
{
complain_at (loc, _("redeclaration for default tagged %%printer"));
complain_at (default_tagged_printer_location,
_("previous declaration"));
}
default_tagged_printer = printer;
default_tagged_printer_location = loc;
}
void
default_tagless_printer_set (const char *printer, location loc)
{
if (default_tagless_printer != NULL)
{
complain_at (loc, _("redeclaration for default tagless %%printer"));
complain_at (default_tagless_printer_location,
_("previous declaration"));
}
default_tagless_printer = printer;
default_tagless_printer_location = loc;
}