with the discarded symbol, and @code{@@$} designates its location.
The additional parser parameters are also available (@pxref{Parser Function, ,
The Parser Function @code{yyparse}}).
-@end deffn
-@deffn {Directive} %destructor @{ @var{code} @} %symbol-default
-@cindex default %destructor
-@findex %symbol-default
-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}.
-As in the previous form, @code{$$}, @code{@@$}, and the additional parser
-parameters are available.
+When a symbol is listed among @var{symbols}, its @code{%destructor} is called a
+per-symbol @code{%destructor}.
+You may also define a per-type @code{%destructor} by listing a semantic type
+among @var{symbols}.
+In that case, the parser will invoke this @var{code} whenever it discards any
+grammar symbol that has that semantic type unless that symbol has its own
+per-symbol @code{%destructor}.
+
+Finally, you may define a default @code{%destructor} by placing
+@code{%symbol-default} in the @var{symbols} list of exactly one
+@code{%destructor} declaration in your grammar file.
+In that case, the parser will invoke the associated @var{code} whenever it
+discards any user-defined grammar symbol for which there is no per-type or
+per-symbol @code{%destructor}.
@end deffn
+@noindent
For instance:
@smallexample
%token <string> STRING2
%type <string> string1
%type <string> string2
+%union @{ char character; @}
+%token <character> CHR
+%type <character> chr
%destructor @{ free ($$); @} %symbol-default
%destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1
+%destructor @{ @} <character>
@end smallexample
@noindent
-guarantees that, when the parser discards any user-defined symbol, it passes
-its semantic value to @code{free}.
+guarantees that, when the parser discards any user-defined symbol that has a
+semantic type tag other than @code{<character>}, 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