Whether the default %destructor/%printer applies to a particular symbol

isn't a question of whether the user *declares* that symbol (in %token,
for example).  It's a question of whether the user by any means
*defines* the symbol at all (by simply using a char token, for
example).  $end is defined by Bison whereas any other token with token
number 0 is defined by the user.  The error token is always defined by
Bison regardless of whether the user declares it with %token, but we
may one day let the user define error as a nonterminal instead.
* NEWS (2.3+): Say "user-defined" instead of "user-declared".
* doc/bison.texinfo (Freeing Discarded Symbols): Likewise, and document
the meaning of "user-defined".
* tests/actions.at (Default %printer and %destructor for user-declared
end token): Rename to...
(Default %printer and %destructor for user-defined end token): ...
this.

* src/symtab.c (symbol_destructor_get, symbol_printer_get): In the
computation of whether to apply the default, don't maintain a list of
every Bison-defined symbol.  Instead, just check for a first character
of '$', which a user symbol cannot have, and check for the error token.
This commit is contained in:
Joel E. Denny
2006-08-24 01:26:07 +00:00
parent 9350499cfc
commit 3508ce361b
5 changed files with 52 additions and 9 deletions

View File

@@ -1,3 +1,26 @@
2006-08-23 Joel E. Denny <jdenny@ces.clemson.edu>
Whether the default %destructor/%printer applies to a particular symbol
isn't a question of whether the user *declares* that symbol (in %token,
for example). It's a question of whether the user by any means
*defines* the symbol at all (by simply using a char token, for
example). $end is defined by Bison whereas any other token with token
number 0 is defined by the user. The error token is always defined by
Bison regardless of whether the user declares it with %token, but we
may one day let the user define error as a nonterminal instead.
* NEWS (2.3+): Say "user-defined" instead of "user-declared".
* doc/bison.texinfo (Freeing Discarded Symbols): Likewise, and document
the meaning of "user-defined".
* tests/actions.at (Default %printer and %destructor for user-declared
end token): Rename to...
(Default %printer and %destructor for user-defined end token): ...
this.
* src/symtab.c (symbol_destructor_get, symbol_printer_get): In the
computation of whether to apply the default, don't maintain a list of
every Bison-defined symbol. Instead, just check for a first character
of '$', which a user symbol cannot have, and check for the error token.
2006-08-21 Joel E. Denny <jdenny@ces.clemson.edu>
Don't apply the default %destructor or %printer to the error token,

2
NEWS
View File

@@ -24,7 +24,7 @@ Changes in version 2.3+:
%destructor { free ($$); }
%destructor { free ($$); printf ("%d", @$.first_line); } STRING1 string1
guarantees that, when the parser discards any user-declared symbol, it passes
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.

View File

@@ -4014,7 +4014,7 @@ The Parser Function @code{yyparse}}).
@deffn {Directive} %destructor @{ @var{code} @}
@cindex default %destructor
Invoke the braced @var{code} whenever the parser discards any user-declared
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}.
@@ -4035,13 +4035,35 @@ For instance:
@end smallexample
@noindent
guarantees that, when the parser discards any user-declared symbol, it passes
guarantees that, when the parser discards any user-defined symbol, 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
@code{free} only once.
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}:
@smallexample
%token END 0
@end smallexample
@ignore
@noindent
In the future, it may be possible to redefine the @code{error} token as a
nonterminal that captures the discarded symbols.
In that case, the parser will invoke the default destructor for it as well.
@end ignore
@sp 1
@cindex discarded symbols

View File

@@ -168,8 +168,7 @@ symbol_destructor_get (symbol *sym)
return sym->destructor;
/* Apply the default %destructor only to user-defined symbols. */
if (sym == errtoken || sym == undeftoken || sym == accept
|| UNIQSTR_EQ (sym->tag, uniqstr_new ("$end")))
if (sym->tag[0] == '$' || sym == errtoken)
return NULL;
return default_destructor;
}
@@ -214,8 +213,7 @@ symbol_printer_get (symbol *sym)
return sym->printer;
/* Apply the default %printer only to user-defined symbols. */
if (sym == errtoken || sym == undeftoken || sym == accept
|| UNIQSTR_EQ (sym->tag, uniqstr_new ("$end")))
if (sym->tag[0] == '$' || sym == errtoken)
return NULL;
return default_printer;
}

View File

@@ -690,10 +690,10 @@ AT_CLEANUP
## ------------------------------------------------------------- ##
## Default %printer and %destructor for user-declared end token. ##
## Default %printer and %destructor for user-defined end token. ##
## ------------------------------------------------------------- ##
AT_SETUP([Default %printer and %destructor for user-declared end token])
AT_SETUP([Default %printer and %destructor for user-defined end token])
AT_DATA_GRAMMAR([[input.y]],
[[%error-verbose