0

FlexとBisonを一緒に使いたいです。レクサーで使用する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

を使用する場合、flexは、グローバルではなくパラメーターとして--bison-bridge期待するスキャナーを作成し、そのパラメーターはではなくです。正しく機能させるには、bisonソースファイル(.y)で指定する必要があるため、グローバルを宣言する(およびyylexが使用することを期待する)のではなく、追加の引数を使用してyylexを呼び出します。yylvalYYSTYPE *YYSTYPE%define api.pureyylval

したがって、--bison-bridge引数を削除するか(yylexとyyparseの間の通常のデフォルトの非リエントラント呼び出し規約を使用するため)、または%define api.pure.yファイルに追加して、yylval->代わりに使用するように.lコードを変更する必要があります。yylval.どこにでも。

于 2012-08-07T19:12:34.580 に答える