Hi Kaz;
I''ll have to think about this some more. The quick take is that only
%code import is available for use in D and Java. The remaining tags are
for C/C++. If this is not correct then please correct me (sigh, having a
dialog with someone who knows what he's talking about is such a humbling
experience), and the User's Manual.
Here is my table of reason, which I hope is reasonable.
%code tag
C/C++
D/Java
Description
%code
•
Placed after all declarations
%code import
•
•
Placed in an importable class
%code provides
•
Placed after YYSTAB, YYLTYPE declaration
%code requires
•
Placed before YYSTAB, YYLTYPE declaration
%code top
•
Placed after Bison prologue and before %code require
art
On 6/19/2022 9:06 AM, Kaz Kylheku wrote:
On 2022-06-17 10:26, slipbits wrote:
3.1.2 Prologue Alternatives, pg. 50
“and the new YYLTYPE definition before the Bison-generated YYSTYPE
and YYLTYPE definitions in both the parser implementation file and
the parser header file”.
This position causes, in this case, YYLTYPE to be doubly defined in the
same scope.
[ elided ]
Is this a bug?
There are ways in which both the header file and the parser source file
can independently provide a definition such that they don't clash:
/* paste freely wherever you want, however many times you want */
#ifndef FOO_DEFINED
struct foo { int x; };
#define FOO_DEFINED
#endif
The text refers to an example, and in that example this appears:
#define YYLTYPE YYLTYPE
typedef struct YYLTYPE
{ ...
in all likelihood, the Bison-generated skeleton code is checking for
the presence of the preprocessor symbol
You should try the example; if that doesn't work, then there is a bug.
I don't use YYLTYPE, but for YYSTYPE, Bison clearly generates
code like:
if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
Not sure about Java and other supported languages that don't have
preprocessing.