1

私は字句解析とパーサー生成に不慣れで、ウィキペディアからバイソンの例をコンパイルすることから直接始めようとしました。これは再入可能パーサーの例です。

bison の 2 つのバージョン (2.5 と 2.6.5) でコンパイルしようとしました。前者は完全にコンパイルおよび実行されますが、後者にはyyscan_t、レクサー ヘッダー (Lexer.h) で宣言されているパーサー ヘッダーに型が含まれています (再入可能機能には必要だと思います)。Parser.cしたがって、によって生成されたコンパイルは行われませんParser.y

Parser.h2.5 には存在しない、2.6.5 によって生成された余分な部分を次に示します。

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (SExpression **expression, yyscan_t scanner); // this line
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */

問題の原因となっている行をマークしました。何かご意見は?

yyscan_t編集:バイソンによって生成されたヘッダーファイルで宣言されていることを確認する必要があります。

4

1 に答える 1

3

実際、2.6 以降の bison は、前述のコード ブロックをヘッダー セクションに挿入します。

%code {...} (または %{...%}) セクションの一部であったサブセクションを新しいコードに移動して、このブロックの前に yyparse 関数引数のすべての宣言を挿入するように bison に指示する必要があります。 yy ファイルのヘッダーの先頭に挿入されるように、タグ「requires」を含むセクション:

%code requires {
typedef void*                 yyscan_t;
} 

Bison Fraking マニュアルを参照してください。

http://www.gnu.org/software/bison/manual/html_node/_0025code-Summary.html

http://www.gnu.org/software/bison/manual/html_node/Prologue-Alternatives.html#Prologue-Alternatives

それが役立つことを願っています

于 2013-01-23T16:48:46.173 に答える