c++: make it clear that #define YYSTYPE is not supported

We have been accepting this for years, but it is deprecated: people
are expecting to define api.value.type instead.

* doc/bison.texi: Make it clear that YYSTYPE and YYLTYPE are for C
only.
This commit is contained in:
Akim Demaille
2021-01-31 13:18:51 +01:00
parent a70e21215a
commit dc8fe0678a
3 changed files with 31 additions and 35 deletions

7
NEWS
View File

@@ -2,6 +2,13 @@ GNU Bison NEWS
* Noteworthy changes in release 3.7.5 (2021-01-24) [stable] * Noteworthy changes in release 3.7.5 (2021-01-24) [stable]
** Deprecated features
It is always recommended to prefer `%define api.value.type foo` to
`#define YYSTYPE foo`. The latter is supported in C for compatibility
with Yacc, but not in C++. Warnings are now issued if `#define YYSTYPE`
is used in C++, and eventually support will be removed.
** Bug fixes ** Bug fixes
*** Counterexample Generation *** Counterexample Generation

5
TODO
View File

@@ -45,10 +45,7 @@ There are many macros that should obey api.prefix: YY_CPLUSPLUS, YY_MOVE,
etc. etc.
** YYDEBUG etc. in C++ ** YYDEBUG etc. in C++
Discourage the use of YYDEBUG in C++ (see thread with Jot). Stop supporting Discourage the use of YYDEBUG in C++ (see thread with Jot).
#define YYSTYPE by the user.
Add value_type as a synonym for semantic_type.
** yyerrok in Java ** yyerrok in Java
And add tests in calc.at, to prepare work for D. And add tests in calc.at, to prepare work for D.

View File

@@ -3870,9 +3870,8 @@ or
The value of @code{api.value.type} should be a type name that does not The value of @code{api.value.type} should be a type name that does not
contain parentheses or square brackets. contain parentheses or square brackets.
Alternatively, instead of relying of Bison's @code{%define} support, you may Alternatively in C, instead of relying of Bison's @code{%define} support,
rely on the C/C++ preprocessor and define @code{YYSTYPE} as a macro, like you may rely on the C preprocessor and define @code{YYSTYPE} as a macro:
this:
@example @example
#define YYSTYPE double #define YYSTYPE double
@@ -3883,7 +3882,7 @@ This macro definition must go in the prologue of the grammar file
(@pxref{Grammar Outline}). If compatibility with POSIX Yacc matters to you, (@pxref{Grammar Outline}). If compatibility with POSIX Yacc matters to you,
use this. Note however that Bison cannot know @code{YYSTYPE}'s value, not use this. Note however that Bison cannot know @code{YYSTYPE}'s value, not
even whether it is defined, so there are services it cannot provide. even whether it is defined, so there are services it cannot provide.
Besides this works only for languages that have a preprocessor. Besides this works only for C.
@node Multiple Types @node Multiple Types
@subsection More Than One Value Type @subsection More Than One Value Type
@@ -4644,7 +4643,7 @@ actions to take when rules are matched.
Defining a data type for locations is much simpler than for semantic values, Defining a data type for locations is much simpler than for semantic values,
since all tokens and groupings always use the same type. since all tokens and groupings always use the same type.
You can specify the type of locations by defining a macro called In C, you can specify the type of locations by defining a macro called
@code{YYLTYPE}, just as you can specify the semantic value type by defining @code{YYLTYPE}, just as you can specify the semantic value type by defining
a @code{YYSTYPE} macro (@pxref{Value Type}). When @code{YYLTYPE} is not a @code{YYSTYPE} macro (@pxref{Value Type}). When @code{YYLTYPE} is not
defined, Bison uses a default structure type with four members: defined, Bison uses a default structure type with four members:
@@ -6743,7 +6742,7 @@ Any valid identifier.
Introduced in Bison 3.0.3. Introduced in Bison 3.0.3.
@end itemize @end itemize
@end deffn @end deffn
@c api.value.type @c api.value.union.name
@c ================================================== lr.default-reduction @c ================================================== lr.default-reduction
@@ -6979,16 +6978,19 @@ qualifiers produce an error. Some of the accepted qualifiers are:
@itemize @bullet @itemize @bullet
@item Language(s): C, C++ @item Language(s): C, C++
@item Purpose: This is the best place to write dependency code required for @item Purpose:
@code{YYSTYPE} and @code{YYLTYPE}. In other words, it's the best place to This is the best place to write dependency code required for the value and
define types referenced in @code{%union} directives. If you use location types (@code{YYSTYPE} and @code{YYLTYPE} in C). In other words,
@code{#define} to override Bison's default @code{YYSTYPE} and @code{YYLTYPE} it's the best place to define types referenced in @code{%union} directives.
definitions, then it is also the best place. However you should rather In C, if you use @code{#define} to override Bison's default @code{YYSTYPE}
@code{%define} @code{api.value.type} and @code{api.location.type}. and @code{YYLTYPE} definitions, then it is also the best place. However you
should rather @code{%define} @code{api.value.type} and
@code{api.location.type}.
@item Location(s): The parser header file and the parser implementation file @item Location(s):
before the Bison-generated @code{YYSTYPE} and @code{YYLTYPE} The parser header file and the parser implementation file before the
definitions. Bison-generated definitions of the value and location types (@code{YYSTYPE}
and @code{YYLTYPE} in C).
@end itemize @end itemize
@item provides @item provides
@@ -7000,9 +7002,10 @@ definitions.
@item Purpose: This is the best place to write additional definitions and @item Purpose: This is the best place to write additional definitions and
declarations that should be provided to other modules. declarations that should be provided to other modules.
@item Location(s): The parser header file and the parser implementation @item Location(s):
file after the Bison-generated @code{YYSTYPE}, @code{YYLTYPE}, and The parser header file and the parser implementation file after the
token definitions. Bison-generated value and location types (@code{YYSTYPE} and @code{YYLTYPE}
in C), and token definitions.
@end itemize @end itemize
@item top @item top
@@ -12379,9 +12382,6 @@ parser uses it to report a parser error occurring at @var{l}, described by
@node C++ Semantic Values @node C++ Semantic Values
@subsection C++ Semantic Values @subsection C++ Semantic Values
@c - No objects in unions
@c - YYSTYPE
@c - Printer and destructor
Bison supports two different means to handle semantic values in C++. One is Bison supports two different means to handle semantic values in C++. One is
alike the C interface, and relies on unions. As C++ practitioners know, alike the C interface, and relies on unions. As C++ practitioners know,
@@ -12401,9 +12401,7 @@ particular it produces a genuine @code{union}, which have a few specific
features in C++. features in C++.
@itemize @minus @itemize @minus
@item @item
The type @code{YYSTYPE} is defined but its use is discouraged: rather you The value type is @code{yy::parser::value_type}, not @code{YYSTYPE}.
should refer to the parser's encapsulated type
@code{yy::parser::value_type}.
@item @item
Non POD (Plain Old Data) types cannot be used. C++98 forbids any instance Non POD (Plain Old Data) types cannot be used. C++98 forbids any instance
of classes with constructors in unions: only @emph{pointers} to such objects of classes with constructors in unions: only @emph{pointers} to such objects
@@ -13840,9 +13838,6 @@ No header file can be generated for D parsers. Do not use the
@node D Semantic Values @node D Semantic Values
@subsection D Semantic Values @subsection D Semantic Values
@c - %union
@c - YYSTYPE
@c - Printer and destructor
Semantic types are handled by %union, same as for C/C++ parsers. Semantic types are handled by %union, same as for C/C++ parsers.
@@ -14218,9 +14213,6 @@ report a bug so that the parser skeleton will be improved.
@node Java Semantic Values @node Java Semantic Values
@subsection Java Semantic Values @subsection Java Semantic Values
@c - No %union, specify type in %nterm/%token.
@c - YYSTYPE
@c - Printer and destructor
There is no @code{%union} directive in Java parsers. Instead, the semantic There is no @code{%union} directive in Java parsers. Instead, the semantic
values' types (class names) should be specified in the @code{%nterm} or values' types (class names) should be specified in the @code{%nterm} or
@@ -16082,8 +16074,8 @@ require some expertise in low-level implementation details.
@end deffn @end deffn
@deffn {Type} YYSTYPE @deffn {Type} YYSTYPE
In C, data type of semantic values; @code{int} by default.
Deprecated in favor of the @code{%define} variable @code{api.value.type}. Deprecated in favor of the @code{%define} variable @code{api.value.type}.
Data type of semantic values; @code{int} by default.
@xref{Value Type}. @xref{Value Type}.
@end deffn @end deffn