私はフレックスレクサーを使用しています。 (1)入力文字列に現在のインデックスを取得する方法(2)将来の時点でそのインデックスにジャンプする方法はありますか?入力文字列の現在のインデックスを取得する(フレックスレクサー)
ありがとうございました。
私はフレックスレクサーを使用しています。 (1)入力文字列に現在のインデックスを取得する方法(2)将来の時点でそのインデックスにジャンプする方法はありますか?入力文字列の現在のインデックスを取得する(フレックスレクサー)
ありがとうございました。
現在の入力位置を維持するのはかなり簡単です。ルールが一致した場合、yyleng
には一致の長さが含まれているため、処理された累積長にはyyleng
を足して足りれば十分です。あなたがフレックスを使用していると仮定すると、すべてのルールアクションにコードを直接挿入する必要はありません。これは面倒です。 (これは、字句のスキャンが開始したときに0にどこかinput_pos
を定義し、それを初期化するために配置されていることを前提としています。)
#define YY_USER_ACTION input_pos += yyleng;
これはにつながる:代わりに、YY_USER_ACTION
マクロを使用することができますREJECT
,yymore()
,yyless()
またはinput()
を使用すると正しくない結果が返されます。これらすべてのケースでは、input_pos
の値を調整する必要があります。 yymore()
を呼び出すたびにyyleng
をinput_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を使用していない場合は、スキャナジェネレータ)