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:
Joel E. Denny
2006-09-04 22:20:52 +00:00
parent 3be03b13e5
commit b2a0b7ca70
8 changed files with 484 additions and 45 deletions

29
NEWS
View File

@@ -12,22 +12,27 @@ Changes in version 2.3+:
* Locations columns and lines start at 1.
In accordance with the GNU Coding Standards and Emacs.
* You may now declare a default %destructor and %printer:
* You may now declare per-type and default %destructor's and %printer's:
For example:
%union { char *string; }
%token <string> STRING1
%token <string> STRING2
%type <string> string1
%type <string> string2
%destructor { free ($$); } %symbol-default
%destructor { free ($$); printf ("%d", @$.first_line); } STRING1 string1
%union { char *string; }
%token <string> STRING1
%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>
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.
guarantees that, when the parser discards any user-defined symbol that has a
semantic type tag other than `<character>', 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.
* Except for LALR(1) parsers in C with POSIX Yacc emulation enabled (with `-y',
`--yacc', or `%yacc'), Bison no longer generates #define statements for