mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 00:33: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:
47
src/symtab.h
47
src/symtab.h
@@ -106,7 +106,6 @@ struct symbol
|
||||
bool declared;
|
||||
};
|
||||
|
||||
|
||||
/** Undefined user number. */
|
||||
#define USER_NUMBER_UNDEFINED -1
|
||||
|
||||
@@ -197,15 +196,51 @@ extern symbol *startsymbol;
|
||||
extern location startsymbol_location;
|
||||
|
||||
|
||||
/*---------------.
|
||||
| Symbol table. |
|
||||
`---------------*/
|
||||
/*-----------------.
|
||||
| Semantic types. |
|
||||
`-----------------*/
|
||||
|
||||
/** A semantic type and its associated \c \%destructor and \c \%printer.
|
||||
|
||||
Access the fields of this struct only through the interface functions in
|
||||
this file. \sa symbol::destructor */
|
||||
typedef struct semantic_type {
|
||||
/** The key, name of the semantic type. */
|
||||
uniqstr tag;
|
||||
|
||||
/** Create the symbol table. */
|
||||
/** Any \c %destructor declared for this semantic type. */
|
||||
const char *destructor;
|
||||
/** The location of \c semantic_type::destructor. */
|
||||
location destructor_location;
|
||||
|
||||
/** Any \c %printer declared for this semantic type. */
|
||||
const char *printer;
|
||||
/** The location of \c semantic_type::printer. */
|
||||
location printer_location;
|
||||
} semantic_type;
|
||||
|
||||
/** Fetch (or create) the semantic type associated to KEY. */
|
||||
semantic_type *semantic_type_from_uniqstr (const uniqstr key);
|
||||
|
||||
/** Fetch (or create) the semantic type associated to KEY. */
|
||||
semantic_type *semantic_type_get (const char *key);
|
||||
|
||||
/** Set the \c destructor associated with \c type. */
|
||||
void semantic_type_destructor_set (semantic_type *type, const char *destructor,
|
||||
location loc);
|
||||
|
||||
/** Set the \c printer associated with \c type. */
|
||||
void semantic_type_printer_set (semantic_type *type, const char *printer,
|
||||
location loc);
|
||||
|
||||
/*----------------------------------.
|
||||
| Symbol and semantic type tables. |
|
||||
`----------------------------------*/
|
||||
|
||||
/** Create the symbol and semantic type tables. */
|
||||
void symbols_new (void);
|
||||
|
||||
/** Free all the memory allocated for symbols. */
|
||||
/** Free all the memory allocated for symbols and semantic types. */
|
||||
void symbols_free (void);
|
||||
|
||||
/** Check that all the symbols are defined.
|
||||
|
||||
Reference in New Issue
Block a user