2

私の bison / flex パーサーは、ファイルから入力を読み取ることから始めます。

FILE *myfile = fopen(file.c_str(), "r");
yyin = myfile;
yyparse();

その後のある時点で、メモリ内の文字列から入力を読み取り、解析します。

yy_scan_string(str.c_str());
yyparse();
yy_delete_buffer(YY_CURRENT_BUFFER);

ここまではうまくいきそうです。ただし、プログラムが最初のコードを使用してファイルから入力を再度読み取って解析する必要がある場合、プログラムは機能しません (セグメンテーション違反で終了します)。この問題の修正はありますか?

4

2 に答える 2

4

問題は、上記の 2 番目のコード ブロックの後で、flex の入力 buffer( ) が、 で作成して で削除しYY_CURRENT_BUFFERたバッファを指していることです。そのため、 (from から)への次の呼び出しは、ダングリング ポインターの逆参照からクラッシュする可能性があります。したがって、呼び出す必要があるのは、呼び出し後と再度呼び出す前に、バッファーの状態を有効なバッファーに設定することです。ご指摘のとおり、プッシュ/ポップを使用してそれを行うことができます (ただし、そのコードは作成された 2 つのバッファーをリークし、解放することはありません)。または、文字列からの解析の周りの古いバッファをより直接的に保存および復元できます。yy_scan_stringyy_delete_bufferyylexyyparseyy_switch_to_bufferyy_delete_bufferyyparse

YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
yy_scan_string(str.c_str());
yyparse();
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(temp);
于 2012-12-10T02:47:51.830 に答える
0

バッファを押したりポップしたりするだけで、それを理解できたと思います。上記の代わりに、私は以下を使用しました:

yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));

yypush_buffer_state(yy_scan_string(str));

yypop_buffer_state();

ソース: http ://westes.github.io/flex/manual/Multiple-Input-Buffers.html

于 2012-12-09T21:54:50.360 に答える