0

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

  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

4

1 回答 1

4

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

因此,您需要摆脱--bison-bridge参数(在 yylex 和 yyparse 之间使用正常的、默认的、不可重入的调用约定),或者您需要添加%define api.pure到 .y 文件,并更改您的 .l 代码以使用yylval->而不是yylval.到处。

于 2012-08-07T19:12:34.580 回答