mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Split the default %destructor/%printer into two kinds: <*> and <!>.
Discussed starting at <http://lists.gnu.org/archive/html/bison-patches/2006-09/msg00060.html>. * NEWS (2.3a+): Mention. * doc/bison.texinfo (Freeing Discarded Symbols): Document this and the previous change today related to mid-rules. (Bison Symbols): Remove %symbol-default and add <*> and <!>. * src/parser-gram.y (PERCENT_SYMBOL_DEFAULT): Remove. (TYPE_TAG_ANY): Add as <*>. (TYPE_TAG_NONE): Add as <!>. (generic_symlist_item): Remove RHS for %symbol-default and add RHS's for <*> and <!>. * src/scan-gram.l (PERCENT_SYMBOL_DEFAULT): Remove. (TYPE_TAG_ANY, TYPE_TAG_NONE): Add. * src/symlist.c (symbol_list_default_new): Split into tagged and tagless versions. (symbol_list_destructor_set, symbol_list_printer_set): Split SYMLIST_DEFAULT case into SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS. * src/symlist.h: Update symbol_list_default*_new prototypes. (symbol_list.content_type): Split enum value SYMLIST_DEFAULT into SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS. * src/symtab.c (default_destructor, default_destructor_location, default_printer, default_printer_location): Split each into tagged and tagless versions. (symbol_destructor_get, symbol_destructor_location_get, symbol_printer_get, symbol_printer_location_get): Implement tagged default and tagless default cases. (default_destructor_set, default_printer_set): Split each into tagged and tagless versions. * src/symtab.h: Update prototypes. * tests/actions.at (Default %printer and %destructor): Rename to... (Default tagless %printer and %destructor): ... this, and extend. (Per-type %printer and %destructor): Rename to... (Default tagged and per-type %printer and %destructor): ... this, and extend. (Default %printer and %destructor for user-defined end token): Extend. (Default %printer and %destructor are not for error or $undefined): Update. (Default %printer and %destructor are not for $accept): Update. (Default %printer and %destructor for mid-rule values): Extend. * tests/input.at (Default %printer and %destructor redeclared): Extend. (Unused values with default %destructor): Extend.
This commit is contained in:
@@ -4236,8 +4236,8 @@ For instance, if your locations use a file name, you may use
|
||||
@subsection Freeing Discarded Symbols
|
||||
@cindex freeing discarded symbols
|
||||
@findex %destructor
|
||||
@findex %symbol-default
|
||||
|
||||
@findex <*>
|
||||
@findex <!>
|
||||
During error recovery (@pxref{Error Recovery}), symbols already pushed
|
||||
on the stack and tokens coming from the rest of the file are discarded
|
||||
until the parser falls on its feet. If the parser runs out of memory,
|
||||
@@ -4265,21 +4265,26 @@ 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}.
|
||||
tag 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
|
||||
grammar symbol that has that semantic type tag 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}.
|
||||
Finally, you can define two different kinds of default @code{%destructor}s.
|
||||
You can place each of @code{<*>} and @code{<!>} in the @var{symbols} list of
|
||||
exactly one @code{%destructor} declaration in your grammar file.
|
||||
The parser will invoke the @var{code} associated with one of these whenever it
|
||||
discards any user-defined grammar symbol that has no per-symbol and no per-type
|
||||
@code{%destructor}.
|
||||
The parser uses the @var{code} for @code{<*>} in the case of such a grammar
|
||||
symbol for which you have formally declared a semantic type tag (@code{%type}
|
||||
counts as such a declaration, but @code{$<tag>$} does not).
|
||||
The parser uses the @var{code} for @code{<!>} in the case of such a grammar
|
||||
symbol that has no declared semantic type tag.
|
||||
@end deffn
|
||||
|
||||
@noindent
|
||||
For instance:
|
||||
For example:
|
||||
|
||||
@smallexample
|
||||
%union @{ char *string; @}
|
||||
@@ -4290,35 +4295,52 @@ For instance:
|
||||
%union @{ char character; @}
|
||||
%token <character> CHR
|
||||
%type <character> chr
|
||||
%destructor @{ free ($$); @} %symbol-default
|
||||
%destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1
|
||||
%token TAGLESS
|
||||
|
||||
%destructor @{ @} <character>
|
||||
%destructor @{ free ($$); @} <*>
|
||||
%destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1
|
||||
%destructor @{ printf ("Discarding tagless symbol.\n"); @} <!>
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
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}.
|
||||
to @code{free} by default.
|
||||
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
|
||||
@code{free} only once.
|
||||
Finally, the parser merely prints a message whenever it discards any symbol,
|
||||
such as @code{TAGLESS}, that has no semantic type tag.
|
||||
|
||||
Notice that a Bison-generated parser invokes the default @code{%destructor}
|
||||
only for user-defined as opposed to Bison-defined symbols.
|
||||
For example, the parser will not invoke it for the special Bison-defined
|
||||
symbols @code{$accept}, @code{$undefined}, or @code{$end} (@pxref{Table of
|
||||
Symbols, ,Bison Symbols}), none of which you can reference in your grammar.
|
||||
It also will not invoke it for the @code{error} token (@pxref{Table of Symbols,
|
||||
,error}), which is always defined by Bison regardless of whether you reference
|
||||
it in your grammar.
|
||||
However, it will invoke it for the end token (token 0) if you redefine it from
|
||||
@code{$end} to, for example, @code{END}:
|
||||
A Bison-generated parser invokes the default @code{%destructor}s only for
|
||||
user-defined as opposed to Bison-defined symbols.
|
||||
For example, the parser will not invoke either kind of default
|
||||
@code{%destructor} for the special Bison-defined symbols @code{$accept},
|
||||
@code{$undefined}, or @code{$end} (@pxref{Table of Symbols, ,Bison Symbols}),
|
||||
none of which you can reference in your grammar.
|
||||
It also will not invoke either for the @code{error} token (@pxref{Table of
|
||||
Symbols, ,error}), which is always defined by Bison regardless of whether you
|
||||
reference it in your grammar.
|
||||
However, it may invoke one of them for the end token (token 0) if you
|
||||
redefine it from @code{$end} to, for example, @code{END}:
|
||||
|
||||
@smallexample
|
||||
%token END 0
|
||||
@end smallexample
|
||||
|
||||
@cindex actions in mid-rule
|
||||
@cindex mid-rule actions
|
||||
Finally, Bison will never invoke a @code{%destructor} for an unreferenced
|
||||
mid-rule semantic value (@pxref{Mid-Rule Actions,,Actions in Mid-Rule}).
|
||||
That is, Bison does not consider a mid-rule to have a semantic value if you do
|
||||
not reference @code{$$} in the mid-rule's action or @code{$@var{n}} (where
|
||||
@var{n} is the RHS symbol position of the mid-rule) in any later action in that
|
||||
rule.
|
||||
However, if you do reference either, the Bison-generated parser will invoke the
|
||||
@code{<!>} @code{%destructor} whenever it discards the mid-rule symbol.
|
||||
|
||||
@ignore
|
||||
@noindent
|
||||
In the future, it may be possible to redefine the @code{error} token as a
|
||||
@@ -8544,6 +8566,18 @@ Separates alternate rules for the same result nonterminal.
|
||||
@xref{Rules, ,Syntax of Grammar Rules}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} <*>
|
||||
Used to define a default tagged @code{%destructor} or default tagged
|
||||
@code{%printer}.
|
||||
@xref{Destructor Decl, , Freeing Discarded Symbols}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} <!>
|
||||
Used to define a default tagless @code{%destructor} or default tagless
|
||||
@code{%printer}.
|
||||
@xref{Destructor Decl, , Freeing Discarded Symbols}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Symbol} $accept
|
||||
The predefined nonterminal whose only rule is @samp{$accept: @var{start}
|
||||
$end}, where @var{start} is the start symbol. @xref{Start Decl, , The
|
||||
@@ -8776,11 +8810,6 @@ Bison declaration to specify the start symbol. @xref{Start Decl, ,The
|
||||
Start-Symbol}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %symbol-default
|
||||
Used to declare a default @code{%destructor} or default @code{%printer}.
|
||||
@xref{Destructor Decl, , Freeing Discarded Symbols}.
|
||||
@end deffn
|
||||
|
||||
@deffn {Directive} %token
|
||||
Bison declaration to declare token(s) without specifying precedence.
|
||||
@xref{Token Decl, ,Token Type Names}.
|
||||
|
||||
Reference in New Issue
Block a user