mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 08:43:03 +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:
@@ -175,8 +175,8 @@ AT_CLEANUP
|
||||
AT_SETUP([Default %printer and %destructor redeclared])
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%destructor { destroy ($$); } %symbol-default
|
||||
%printer { destroy ($$); } %symbol-default
|
||||
[[%destructor { destroy ($$); } %symbol-default %symbol-default
|
||||
%printer { destroy ($$); } %symbol-default %symbol-default
|
||||
|
||||
%destructor { destroy ($$); } %symbol-default
|
||||
%printer { destroy ($$); } %symbol-default
|
||||
@@ -190,7 +190,11 @@ start: ;
|
||||
]])
|
||||
|
||||
AT_CHECK([bison input.y], [1], [],
|
||||
[[input.y:4.13-29: redeclaration for default %destructor
|
||||
[[input.y:1.13-29: redeclaration for default %destructor
|
||||
input.y:1.13-29: previous declaration
|
||||
input.y:2.10-26: redeclaration for default %printer
|
||||
input.y:2.10-26: previous declaration
|
||||
input.y:4.13-29: redeclaration for default %destructor
|
||||
input.y:1.13-29: previous declaration
|
||||
input.y:5.10-26: redeclaration for default %printer
|
||||
input.y:2.10-26: previous declaration
|
||||
@@ -203,6 +207,49 @@ input.y:5.10-26: previous declaration
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## ---------------------------------------------- ##
|
||||
## Per-type %printer and %destructor redeclared. ##
|
||||
## ---------------------------------------------- ##
|
||||
|
||||
AT_SETUP([Per-type %printer and %destructor redeclared])
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%destructor { destroy ($$); } <field1> <field2>
|
||||
%printer { destroy ($$); } <field1> <field2>
|
||||
|
||||
%destructor { destroy ($$); } <field1> <field1>
|
||||
%printer { destroy ($$); } <field2> <field2>
|
||||
|
||||
%%
|
||||
|
||||
start: ;
|
||||
|
||||
%destructor { destroy ($$); } <field2> <field1>;
|
||||
%printer { destroy ($$); } <field2> <field1>;
|
||||
]])
|
||||
|
||||
AT_CHECK([bison input.y], [1], [],
|
||||
[[input.y:4.13-29: %destructor redeclaration for <field1>
|
||||
input.y:1.13-29: previous declaration
|
||||
input.y:4.13-29: %destructor redeclaration for <field1>
|
||||
input.y:4.13-29: previous declaration
|
||||
input.y:5.10-26: %printer redeclaration for <field2>
|
||||
input.y:2.10-26: previous declaration
|
||||
input.y:5.10-26: %printer redeclaration for <field2>
|
||||
input.y:5.10-26: previous declaration
|
||||
input.y:11.13-29: %destructor redeclaration for <field1>
|
||||
input.y:4.13-29: previous declaration
|
||||
input.y:11.13-29: %destructor redeclaration for <field2>
|
||||
input.y:1.13-29: previous declaration
|
||||
input.y:12.10-26: %printer redeclaration for <field1>
|
||||
input.y:2.10-26: previous declaration
|
||||
input.y:12.10-26: %printer redeclaration for <field2>
|
||||
input.y:5.10-26: previous declaration
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## ---------------------------------------- ##
|
||||
## Unused values with default %destructor. ##
|
||||
## ---------------------------------------- ##
|
||||
@@ -227,6 +274,31 @@ input.y:6.6-8: warning: unset value: $$
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## ----------------------------------------- ##
|
||||
## Unused values with per-type %destructor. ##
|
||||
## ----------------------------------------- ##
|
||||
|
||||
AT_SETUP([Unused values with per-type %destructor])
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%destructor { destroy ($$); } <field1>
|
||||
%type <field1> start end
|
||||
|
||||
%%
|
||||
|
||||
start: end end { $1; } ;
|
||||
end: { } ;
|
||||
]])
|
||||
|
||||
AT_CHECK([bison input.y], [0], [],
|
||||
[[input.y:6.8-22: warning: unset value: $$
|
||||
input.y:6.8-22: warning: unused value: $2
|
||||
input.y:7.6-8: warning: unset value: $$
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## ---------------------- ##
|
||||
## Incompatible Aliases. ##
|
||||
## ---------------------- ##
|
||||
|
||||
Reference in New Issue
Block a user