mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 08:13:02 +00:00
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:
@@ -4014,7 +4014,7 @@ The Parser Function @code{yyparse}}).
|
||||
|
||||
@deffn {Directive} %destructor @{ @var{code} @}
|
||||
@cindex default %destructor
|
||||
Invoke the braced @var{code} whenever the parser discards any user-declared
|
||||
Invoke the braced @var{code} whenever the parser discards any user-defined
|
||||
grammar symbol for which the user has not specifically declared any
|
||||
@code{%destructor}.
|
||||
This is known as the default @code{%destructor}.
|
||||
@@ -4035,13 +4035,35 @@ For instance:
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
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 @code{free}.
|
||||
However, when the parser discards a @code{STRING1} or a @code{string1}, it also
|
||||
prints its line number to @code{stdout}.
|
||||
It performs only the second @code{%destructor} in this case, so it invokes
|
||||
@code{free} only once.
|
||||
|
||||
Notice that a Bison-generated parser invokes the default @code{%destructor}
|
||||
only for user-defined as opposed to Bison-defined symbols.
|
||||
For example, the parser will not invoke it for the special Bison-defined
|
||||
symbols @code{$accept}, @code{$undefined}, or @code{$end} (@pxref{Table of
|
||||
Symbols, ,Bison Symbols}), none of which you can reference in your grammar.
|
||||
It also will not invoke it for the @code{error} token (@pxref{Table of Symbols,
|
||||
,error}), which is always defined by Bison regardless of whether you reference
|
||||
it in your grammar.
|
||||
However, it will invoke it for the end token (token 0) if you redefine it from
|
||||
@code{$end} to, for example, @code{END}:
|
||||
|
||||
@smallexample
|
||||
%token END 0
|
||||
@end smallexample
|
||||
|
||||
@ignore
|
||||
@noindent
|
||||
In the future, it may be possible to redefine the @code{error} token as a
|
||||
nonterminal that captures the discarded symbols.
|
||||
In that case, the parser will invoke the default destructor for it as well.
|
||||
@end ignore
|
||||
|
||||
@sp 1
|
||||
|
||||
@cindex discarded symbols
|
||||
|
||||
Reference in New Issue
Block a user