mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-23 03:03:02 +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>
|
2006-08-21 Joel E. Denny <jdenny@ces.clemson.edu>
|
||||||
|
|
||||||
Don't apply the default %destructor or %printer to the error token,
|
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 ($$); }
|
||||||
%destructor { free ($$); printf ("%d", @$.first_line); } STRING1 string1
|
%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'
|
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
|
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.
|
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} @}
|
@deffn {Directive} %destructor @{ @var{code} @}
|
||||||
@cindex default %destructor
|
@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
|
grammar symbol for which the user has not specifically declared any
|
||||||
@code{%destructor}.
|
@code{%destructor}.
|
||||||
This is known as the default @code{%destructor}.
|
This is known as the default @code{%destructor}.
|
||||||
@@ -4035,13 +4035,35 @@ For instance:
|
|||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@noindent
|
@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}.
|
its semantic value to @code{free}.
|
||||||
However, when the parser discards a @code{STRING1} or a @code{string1}, it also
|
However, when the parser discards a @code{STRING1} or a @code{string1}, it also
|
||||||
prints its line number to @code{stdout}.
|
prints its line number to @code{stdout}.
|
||||||
It performs only the second @code{%destructor} in this case, so it invokes
|
It performs only the second @code{%destructor} in this case, so it invokes
|
||||||
@code{free} only once.
|
@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
|
@sp 1
|
||||||
|
|
||||||
@cindex discarded symbols
|
@cindex discarded symbols
|
||||||
|
|||||||
@@ -168,8 +168,7 @@ symbol_destructor_get (symbol *sym)
|
|||||||
return sym->destructor;
|
return sym->destructor;
|
||||||
|
|
||||||
/* Apply the default %destructor only to user-defined symbols. */
|
/* Apply the default %destructor only to user-defined symbols. */
|
||||||
if (sym == errtoken || sym == undeftoken || sym == accept
|
if (sym->tag[0] == '$' || sym == errtoken)
|
||||||
|| UNIQSTR_EQ (sym->tag, uniqstr_new ("$end")))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
return default_destructor;
|
return default_destructor;
|
||||||
}
|
}
|
||||||
@@ -214,8 +213,7 @@ symbol_printer_get (symbol *sym)
|
|||||||
return sym->printer;
|
return sym->printer;
|
||||||
|
|
||||||
/* Apply the default %printer only to user-defined symbols. */
|
/* Apply the default %printer only to user-defined symbols. */
|
||||||
if (sym == errtoken || sym == undeftoken || sym == accept
|
if (sym->tag[0] == '$' || sym == errtoken)
|
||||||
|| UNIQSTR_EQ (sym->tag, uniqstr_new ("$end")))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
return default_printer;
|
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]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[%error-verbose
|
[[%error-verbose
|
||||||
|
|||||||
Reference in New Issue
Block a user