diff options
author | Akim Demaille <akim@lrde.epita.fr> | 2013-02-08 17:17:33 +0100 |
---|---|---|
committer | Akim Demaille <akim@lrde.epita.fr> | 2013-04-09 14:07:51 +0200 |
commit | 6574576cfb6e5039e8a21714e8d9bf482ae7c32f (patch) | |
tree | 84c343ee4fbacca869d20a5ddeeac19e9ea5a407 /NEWS | |
parent | dde95ca432b2b54c8bc8d2dea3e0c9069862321d (diff) | |
download | bison-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-- | NEWS | 73 |
1 files changed, 72 insertions, 1 deletions
@@ -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 |