]> git.saurik.com Git - bison.git/commitdiff
Whether the default %destructor/%printer applies to a particular symbol
authorJoel E. Denny <jdenny@ces.clemson.edu>
Thu, 24 Aug 2006 01:26:07 +0000 (01:26 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Thu, 24 Aug 2006 01:26:07 +0000 (01:26 +0000)
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
NEWS
doc/bison.texinfo
src/symtab.c
tests/actions.at

index 9c8e99518dec2040b620497a8f72e0761ad36ae0..5347cfbc544598802d71a832ec7a4c1f211615dd 100644 (file)
--- a/ChangeLog
+++ b/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,
diff --git a/NEWS b/NEWS
index e9c68cabce81d3fb22a095bb360a65264b7acd12..6fd1cae7bc8e8ba9bf36c4f32f851a67fa6797da 100644 (file)
--- 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.
index a8cdf473e7a3adaa6cb983c7dcf934804aa68532..4f43dbf981b62f546777949e5d415ce7d9dfa64e 100644 (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
index 92d892a5d5304feb080962f70ba7f7bf3997bca2..e3c450f4e44b8c126f6e756e4cdac44c4abc53d7 100644 (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;
 }
index 5989d0a9bc8da7b58781de15d3fbf97b284697c8..c3404818bb0fc6445200e315623e941465deb3f4 100644 (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