Bison Flex编译器错误:请求非结构或联合中的成员

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,如果您使用--

我想一起使用Flex和Bison。我在bison定义文件中声明了一个union,我将在lexer中使用它。Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包括了这个.tab.h文件,但是lexer操作:

  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;