2011-09-30 6 views
7

私はBisonとFlexを使用してリエントラントスキャナ/パーサーのペアを作成していますが、すべてが含まれ宣言されている場所を頭で囲むことはできません。Bison/Flex宣言の混乱...どのように含めるべきですか/どこで宣言しますか?

まず第一に、私はので、私は%parse-param {yyscan_t scanner}を宣言することによって、バイソンに最初yyscan_tスキャナタイプを渡した後、バイソンが%lex-param {yyscan_t scanner}を宣言することによってフレックスにこれを渡すようにする必要がありリエントラントのFlexを使用しています。しかしyyscan_tはBisonによって宣言されていないので、BisonファイルにFlexで生成されたスキャナヘッダファイル(scanner.flex.hという名前)を含める必要があります。しかし、私のFlexファイルには私のBisonヘッダーが含まれていて、私のBisonヘッダーにはFlexヘッダーが含まれているので、予期せぬ方法でものを混乱させる循環インクルードを手に入れました!

私のBisonファイルに%locations、そしてFlexファイルに%bison-locationsという位置追跡を追加したいとします。 YYLTYPEポインタをインクルードするためにBisonファイル内の関数をインクルードすることはできませんが、yylexとyylexの宣言を変更する必要があります(yylex AGAINを定義する必要があります。 。しかし今は何ですか?プロローグが挿入された後にデフォルトのYYLTYPE宣言が置かれているようで、yyerrorとmyyylexの宣言でこのデフォルトのYYLTYPEを使用することはできません。

私は、これらの問題に対する多くの回避策があることを認識しています...しかし、どうすればそれを正しく行うことになっていますか?それは完全に私を逃げ、これはちょうど私の頭を混乱のままにします...

答えて

4

あなたのバイソンファイルの先頭に、これらの値を宣言する必要があります。フレックスファイルとバイソンファイルをインクルードする前に、共通ヘッダーまたはコードファイルでこれを行うことができます。 yyscan_tはvoid *のtypedefですので、voidポインタとしてパラメータを宣言して動作させました。何か他のものを探しながら

CommonHeader.h

int yylex (union YYSTYPE * yyval_param, struct YYLTYPE * yylloc_param, void * yyscanner); 
int yyerror(struct YYLTYPE * yylloc_param, void *scanner, const char *s); 

yyerror関数

int yyerror(struct YYLTYPE * yylloc_param, void *scanner, const char *s) 
{ 
    printf("*** Lexical Error %s %d.%d-%d.%d\n", s, 
     yylloc_param->first_line, yylloc_param->first_column, 
     yylloc_param->last_line, yylloc_param->last_column); 
} 
+0

私は、私はすでに不透明なことになっているので、それは少しハックのように感じていてもということでした* yyscan_tが無効であることを知っています。 YYLTYPEはどうですか?プロローグとフォワードが構造体全体を宣言した後でなければ宣言されません。 –

+0

なぜ構造体を宣言しているのが少し多いように見えますか?別のオプションは、あなたのバイソンファイルに%の定義を追加することです。これにより、含めることができるヘッダーファイルが生成されます。 – Joe

+0

私の部分の脳のおなら全体...私は定義すると思ったが、フォワードは宣言した。私はヘッダーファイルを生成しますが、Bison生成ヘッダーはインクルードガードを持っていないので、無限インクルード再帰につながるため、Bisonファイルには含めることはできません(しかし、型の再定義に対してガードがあります)。 私はこのような何かが '構造体YYLTYPE ?:、しかしYYLTYPEを宣言転送することができ;' '構造体YYLTYPEのYYLTYPEのtypedefを;' –

1

の例は、これに出くわしました。

答えは、Bisonが%UNION仕様の後でYYLTYPEの内部宣言を発行するというものです。したがって、%unionの後に関数プロトタイプや他のものをプロローグセクションに置くと、YYLTYPE宣言の問題を回避できます。これはかなりOKです、バイソンは、複数のプロローグ部分を許可します。

%{ 

/* Prologue 1 */ 

%} 

%this 

%that 

%union {} 

%{ 

/* Prologue 2, YYLTYPE declared */ 

%} 

%% 

blah: talk | blah talk 

%% 
関連する問題