2012-02-25 30 views
2

別の文字列を解析中に、定義済みの文法を使用して定数文字列を解析しようとしています。yyparse()の内部のバッファを変更します。

マイmain()通話yyparse()、ユーザー開始タイピング、および特定の文法が一致したときに、そのようMACROか何かのように、私はいくつかの問題

私は必要
  • すべての定数に走ったyy_scan_string("..."); を実行したいですフレックスによって作成された、と私は私がコンパイルフレックス部分から#ifndef文をコピーすることによってこれを解決し
    • フレックス出力に依存して私のバイソンファイル、で、その後必要がある
  • yy_scan_stringを呼び出した後、私はyyparse()を呼び出してみましたが、私はその後、私は私のメインの解析が終了yy_delete_bufferを呼び出す場合、これは無限ループ
  • に私を投げた、とコードが終了します。

私は何をしないのですか?簡単な作業のようですが、ファイルの解析中に格納された文字列を解析してから、通常の解析に戻したいだけです。

答えて

0

別の解析の途中でbison生成パーサーを呼び出そうとしていますか?パーサーはステートフルであることを覚えておいてください。バイソンをリエントラントな方法で使用したい場合は、バイソンがデフォルトではないリエントラントパーサーを生成するように具体的に要求する必要があります。 bisonマニュアルには、その要請方法を説明する文書があります。例えば、http://www.gnu.org/software/bison/manual/bison.html#Pure-Decl

私は、フレックスもデフォルトではリエントラントではないことに注意します。また、あなたも同様にそれを行う必要があります。

+0

再入可能な解析については知りませんでした。それ以上の詳細は教えてください。 – Mikhail

+0

上記の編集を参照してください。 – Perry

1

あなたは新しい文字列をlexのためにyy_scan_string()を使用するつもりなら、また、現在解析状態のコンテキストを保存するためにyypush_buffer_state()yypop_buffer_state()を使用することが良いでしょう。 (実装例については、Multiple Input Buffersを参照してください。)

+1

新しい状態を開始しない方法がありますか?現在のストリームを少し修正するかのように? – Mikhail

+0

は、「定数」によって、「YY_BUFFER_STATE」などのフレックス定数を意味していました。私は '%token'sを正しく使っています – Mikhail

+0

それはあるべきだと感じますが、それは私の経験外です。ごめんなさい。 – sarnold

関連する問題