mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
23
ChangeLog
23
ChangeLog
@@ -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
2
NEWS
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user