Flex编译器错误:请求成员不是结构或联合

时间:2012-08-07 18:40:30

标签: bison flex-lexer

我想一起使用Flex和Bison。我已经在将在词法分析器中使用的野牛定义文件中声明了一个联合。 Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包含了这个.tab.h文件,但是lexer动作:

  yylval.stringptr = yytext;

导致编译器错误:

lexer.l: In function ‘yylex’:
lexer.l:190: error: request for member ‘stringptr’ in something not a structure or union

以下是.tab.h文件的片段:

#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;

为什么yylval不被识别为结构或联合?我该如何纠正这个问题?

PS:我用--bison-bridge

调用了Flex

1 个答案:

答案 0 :(得分:3)

如果你使用--bison-bridge,那么flex会创建一个扫描程序,希望yylval作为参数而不是全局参数,并且该参数是YYSTYPE *而不是YYSTYPE }。为了使其正常工作,您需要在您的野牛源文件(.y)中指定%define api.pure,因此它将使用额外参数调用yylex,而不是声明(并期望yylex使用)全局{{ 1}}

所以你需要摆脱yylval参数(使用yylex和yyparse之间的正常,默认,不可重入的调用约定),或者你需要将--bison-bridge添加到。{1}}。 y文件,并将.l代码更改为在任何地方使用%define api.pure而不是yylval->