Whether the default %destructor/%printer applies to a particular symbol

isn't a question of whether the user *declares* that symbol (in %token,
for example).  It's a question of whether the user by any means
*defines* the symbol at all (by simply using a char token, for
example).  $end is defined by Bison whereas any other token with token
number 0 is defined by the user.  The error token is always defined by
Bison regardless of whether the user declares it with %token, but we
may one day let the user define error as a nonterminal instead.
* NEWS (2.3+): Say "user-defined" instead of "user-declared".
* doc/bison.texinfo (Freeing Discarded Symbols): Likewise, and document
the meaning of "user-defined".
* tests/actions.at (Default %printer and %destructor for user-declared
end token): Rename to...
(Default %printer and %destructor for user-defined end token): ...
this.

* src/symtab.c (symbol_destructor_get, symbol_printer_get): In the
computation of whether to apply the default, don't maintain a list of
every Bison-defined symbol.  Instead, just check for a first character
of '$', which a user symbol cannot have, and check for the error token.
This commit is contained in:
Joel E. Denny
2006-08-24 01:26:07 +00:00
parent 9350499cfc
commit 3508ce361b
5 changed files with 52 additions and 9 deletions

2
NEWS
View File

@@ -24,7 +24,7 @@ Changes in version 2.3+:
%destructor { free ($$); }
%destructor { free ($$); printf ("%d", @$.first_line); } STRING1 string1
guarantees that, when the parser discards any user-declared symbol, it passes
guarantees that, when the parser discards any user-defined symbol, it passes
its semantic value to `free'. However, when the parser discards a `STRING1'
or a `string1', it also prints its line number to `stdout'. It performs only
the second `%destructor' in this case, so it invokes `free' only once.