我想一起使用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
#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;
PS:我用--bison-bridge
调用了Flex答案 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->
。