From 3508ce361ba6e5c62c592d0caf039d316ed7f84f Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Thu, 24 Aug 2006 01:26:07 +0000 Subject: [PATCH] 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. --- ChangeLog | 23 +++++++++++++++++++++++ NEWS | 2 +- doc/bison.texinfo | 26 ++++++++++++++++++++++++-- src/symtab.c | 6 ++---- tests/actions.at | 4 ++-- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c8e9951..5347cfbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2006-08-23 Joel E. Denny + + 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 Don't apply the default %destructor or %printer to the error token, diff --git a/NEWS b/NEWS index e9c68cab..6fd1cae7 100644 --- a/NEWS +++ b/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. diff --git a/doc/bison.texinfo b/doc/bison.texinfo index a8cdf473..4f43dbf9 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -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 diff --git a/src/symtab.c b/src/symtab.c index 92d892a5..e3c450f4 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -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; } diff --git a/tests/actions.at b/tests/actions.at index 5989d0a9..c3404818 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -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 -- 2.45.2