summaryrefslogtreecommitdiff
path: root/NEWS
diff options
context:
space:
mode:
authorAkim Demaille <akim@lrde.epita.fr>2013-02-08 17:17:33 +0100
committerAkim Demaille <akim@lrde.epita.fr>2013-04-09 14:07:51 +0200
commit6574576cfb6e5039e8a21714e8d9bf482ae7c32f (patch)
tree84c343ee4fbacca869d20a5ddeeac19e9ea5a407 /NEWS
parentdde95ca432b2b54c8bc8d2dea3e0c9069862321d (diff)
downloadbison-6574576cfb6e5039e8a21714e8d9bf482ae7c32f.tar.gz
api.value.type: implement proper support, check, and document
* data/c.m4 (b4_symbol_type_register, b4_type_define_tag) (b4_symbol_value_union, b4_value_type_setup_union) (b4_value_type_setup_variant, b4_value_type_setup): New. (b4_value_type_define): Use it to set up properly the type. Handle the various possible values of api.value.type. * data/c++.m4 (b4_value_type_declare): Likewise. * data/lalr1.cc (b4_value_type_setup_variant): Redefine. * tests/types.at: New. Exercise all the C/C++ skeletons with different types of api.value.type values. * tests/local.mk, tests/testsuite.at: Use it. * doc/bison.texi (%define Summary): Document api.value.type. * NEWS: Advertise it, together with api.token.constructor.
Diffstat (limited to 'NEWS')
-rw-r--r--NEWS73
1 files changed, 72 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 3bfc1f94..3816fdd5 100644
--- a/NEWS
+++ b/NEWS
@@ -252,6 +252,77 @@ GNU Bison NEWS
use these prefixed token names, although the grammar itself still
uses the short names (as in the sample rule given above).
+** Variable api.value.type
+
+ This new %define variable supersedes the #define macro YYSTYPE. The use
+ of YYSTYPE is discouraged. In particular, #defining YYSTYPE *and* either
+ using %union or %defining api.value.type results in undefined behavior.
+
+ Either define api.value.type, or use "%union":
+
+ %union
+ {
+ int ival;
+ char *sval;
+ }
+ %token <ival> INT "integer"
+ %token <sval> STRING "string"
+ %printer { fprintf (yyo, "%d", $$); } <ival>
+ %destructor { free ($$); } <sval>
+
+ /* In yylex(). */
+ yylval.ival = 42; return INT;
+ yylval.sval = "42"; return STRING;
+
+ The %define variable api.value.type supports several special values. The
+ value "union" means that the user provides genuine types, not union member
+ names such as "ival" and "sval" above.
+
+ %define api.value.type "union"
+ %token <int> INT "integer"
+ %token <char *> STRING "string"
+ %printer { fprintf (yyo, "%d", $$); } <int>
+ %destructor { free ($$); } <char *>
+
+ /* In yylex(). */
+ yylval.INT = 42; return INT;
+ yylval.STRING = "42"; return STRING;
+
+ The value "variant" is somewhat equivalent, but for C++ special provision
+ is made to allow classes to be used (more about this below).
+
+ %define api.value.type "variant"
+ %token <int> INT "integer"
+ %token <std::string> STRING "string"
+
+ Any other name is a user type to use. This is where YYSTYPE used to be
+ used.
+
+ %code requires
+ {
+ struct my_value
+ {
+ enum
+ {
+ is_int, is_string
+ } kind;
+ union
+ {
+ int ival;
+ char *sval;
+ } u;
+ };
+ }
+ %define api.value.type "struct my_value"
+ %token <u.ival> INT "integer"
+ %token <u.sval> STRING "string"
+ %printer { fprintf (yyo, "%d", $$); } <u.ival>
+ %destructor { free ($$); } <u.sval>
+
+ /* In yylex(). */
+ yylval.u.ival = 42; return INT;
+ yylval.u.sval = "42"; return STRING;
+
** Variable parse.error
This variable controls the verbosity of error messages. The use of the
@@ -2536,7 +2607,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
LocalWords: Wprecedence Rassoul Wempty Paolo Bonzini parser's Michiel loc
LocalWords: redeclaration sval fcaret reentrant XSLT xsl Wmaybe yyvsp Tedi
LocalWords: pragmas noreturn untyped Rozenman unexpanded Wojciech Polak
- LocalWords: Alexandre MERCHANTABILITY
+ LocalWords: Alexandre MERCHANTABILITY yytype
Local Variables:
mode: outline