2017-11-03 5 views

答えて

1

現在の入力位置を維持するのはかなり簡単です。ルールが一致した場合、yylengには一致の長さが含まれているため、処理された累積長にはyylengを足して足りれば十分です。あなたがフレックスを使用していると仮定すると、すべてのルールアクションにコードを直接挿入する必要はありません。これは面倒です。 (これは、字句のスキャンが開始したときに0にどこかinput_posを定義し、それを初期化するために配置されていることを前提としています。)

#define YY_USER_ACTION input_pos += yyleng; 

これはにつながる:代わりに、YY_USER_ACTIONマクロを使用することができますREJECT,yymore(),yyless()またはinput()を使用すると正しくない結果が返されます。これらすべてのケースでは、input_posの値を調整する必要があります。 yymore()を呼び出すたびにyylenginput_posから引く必要があります。これはREJECTでも有効です。 yyless()へのコールの場合は、コールの前にyylengを差し引いてコールの後に追加することができます。 input()への通話ごとに、input_posに1を追加する必要があります。

ルールの中で、あなたはその後、試合の冒頭に位置として試合の終了位置としてinput_posを使用するか、またはinput_pos - yylengことができます。

保存された位置に戻るのは難しいです。

(F)lexは入力全体をメモリに保持しないため、原則としてfseek()を使用して正しい場所にyyinを巻き戻す必要があります。ただし、yyinがバイナリモードで開かれていない一般的なケースでは、fseek()を確実に使用して、計算された入力オフセットに戻すことはできません。だから少なくとも、yyinがバイナリモードで開かれた(または再オープンされた)ことを確認する必要があります。

さらに、yyinが接続されているストリームは、コンソール入力、パイプ、または他のシーク不可能なデバイスであることがあることを保証することはできません。だから完全に一般的には、ストリームから読み込まれたデータを格納するために一時ファイルを使用する必要があります。これにより、前の入力を再読み込みしようとすると複雑になります。終了するまで読み込むために一時ファイルに切り替える必要があるため、メインファイルに戻す必要があります。 yywrapの創造的な使用は、この手順を簡素化します。

入力ストリームを巻き戻した後(一時ファイルからの読み込みに切り替えるかどうかにかかわらず)、yyrestart()に電話をかけてスキャナの入力バッファをリセットする必要があります。 (これはフレックス専用の機能でもあり、posix lexはスキャナにバッファをリセットする必要があることをスキャナに通知する仕組みを指定していないので、flexを使用していない場合は、スキャナジェネレータ)

関連する問題