mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Finish implementation of per-type %destructor/%printer. Discussed
starting at <http://lists.gnu.org/archive/html/bison-patches/2006-02/msg00064.html> and <http://lists.gnu.org/archive/html/bison-patches/2006-06/msg00091.html>. * NEWS (2.3+): Add a description of this feature to the default %destructor/%printer description. * doc/bison.texinfo (Freeing Discarded Symbols): Likewise. * src/symlist.c (symbol_list_destructor_set, symbol_list_printer_set): Invoke semantic_type_destructor_set or semantic_type_printer_set when a list node contains a semantic type. * src/symtab.c, src/symtab.h: Extend with a table that associates semantic types with their %destructor's and %printer's. (semantic_type_from_uniqstr, semantic_type_get, semantic_type_destructor_set, semantic_type_printer_set): New functions composing the public interface of that table. (symbol_destructor_get, symbol_destructor_location_get, symbol_printer_get, symbol_printer_location_get): If there's no per-symbol %destructor/%printer, look up the per-type before trying the default. * tests/actions.at (Per-type %printer and %destructor): New test case. * tests/input.at (Default %printer and %destructor redeclared): Extend to check that multiple occurrences of %symbol-default in a single %destructor/%printer declaration is an error. (Per-type %printer and %destructor redeclared, Unused values with per-type %destructor): New test cases.
This commit is contained in:
@@ -4011,19 +4011,24 @@ Within @var{code}, @code{$$} designates the semantic value associated
|
||||
with the discarded symbol, and @code{@@$} designates its location.
|
||||
The additional parser parameters are also available (@pxref{Parser Function, ,
|
||||
The Parser Function @code{yyparse}}).
|
||||
|
||||
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
|
||||
|
||||
@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.
|
||||
@end deffn
|
||||
|
||||
@noindent
|
||||
For instance:
|
||||
|
||||
@smallexample
|
||||
@@ -4032,13 +4037,18 @@ For instance:
|
||||
%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
|
||||
|
||||
Reference in New Issue
Block a user