Bison Flex编译器错误:请求非结构或联合中的成员
我想一起使用Flex和Bison。我在bison定义文件中声明了一个union,我将在lexer中使用它。Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包括了这个.tab.h文件,但是lexer操作:Bison Flex编译器错误:请求非结构或联合中的成员,bison,flex-lexer,Bison,Flex Lexer,我想一起使用Flex和Bison。我在bison定义文件中声明了一个union,我将在lexer中使用它。Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包括了这个.tab.h文件,但是lexer操作: yylval.stringptr = yytext; 导致编译器错误: 以下是.tab.h文件的一个片段: 为什么yylval不被认为是一个结构或联盟?我应该如何纠正这个问题? PS:我使用--bison bridge调用了Flex,如果您使用--
yylval.stringptr = yytext;
导致编译器错误:
以下是.tab.h文件的一个片段:
为什么yylval不被认为是一个结构或联盟?我应该如何纠正这个问题?
PS:我使用--bison bridge调用了Flex,如果您使用--bison bridge,那么Flex会创建一个扫描器,希望将yylval
作为一个参数,而不是一个全局参数,并且该参数是YYSTYPE*
而不是YYSTYPE
。为了使其正常工作,您需要在bison源文件(.y)中指定%define api.pure
,这样它将使用额外的参数调用yylex,而不是声明(并期望yylex使用)全局yylval
因此,您需要去掉--bison-bridge
参数(使用yylex和yyparse之间的正常、默认、不可重入的调用约定),或者需要将%define-api.pure
添加到.y文件中,并将.l代码更改为使用yylval->
而不是yylval.
任何地方。如果使用--野牛桥
,flex将创建一个扫描器,该扫描器期望yylval
作为参数,而不是全局参数,并且该参数是YYSTYPE*
而不是YYSTYPE
。为了使其正常工作,您需要在bison源文件(.y)中指定%define api.pure
,这样它将使用额外的参数调用yylex,而不是声明(并期望yylex使用)全局yylval
因此,您需要去掉
--bison桥
参数(使用yylex和yyparse之间的正常、默认、不可重入的调用约定),或者需要将%define api.pure
添加到.y文件中,并将.l代码更改为使用yylval->
而不是yylval.
无处不在。。我拆除了野牛桥,一切正常。我不知道野牛桥选项创造了一个重新进入的lexer。太棒了!两天来,我一直在寻找解决方案!好极了我拆除了野牛桥,一切正常。我不知道野牛桥选项创造了一个重新进入的lexer。太棒了!两天来,我一直在寻找解决方案!
lexer.l: In function ‘yylex’:
lexer.l:190: error: request for member ‘stringptr’ in something not a structure or union
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
#line 9 "parser.y"
char * s;
char * stringptr;
double d;
int i;
/* Line 1676 of yacc.c */
#line 126 "parser.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE yylval;