1

テキストをトークン化するためのフレックスを備えたスキャナーを作成しています。そのために、用語、数字、電子メールなど、文字通りテキストに含まれる可能性のあるあらゆる種類の出現に一致する式を定義しました。

解析する文字列、位置 (一致したトークンの最初の文字)、および長さ ( yyleng. 最初に、いくつかの変数でそれを処理し、yyleng を使用して、この値を変数に追加し、一致の解析済みテキストの開始位置を維持できると考えました。ただし、html タグや html エンティティなどの他のいくつかの出現以外に無視されるため、2 つの一致の間に大きな空白がある場合、それは機能しません。

それを解決する方法はありますか?

たとえば、次の文字列:

I am a text,  tokenize   me.
^ ^  ^ ^   ^  ^          ^ ^
0 2  5 7   11 14         25 27   <-- pos in parsed string
0  2 1 4   1  8          2  1    <-- length of token  

句読点を含む各単語が一致し、空白はすべて無視されます。ここで、文字列内の各一致の開始位置と長さを取得できるようにしたいと考えています。私のトークナイザー クラスでは、getNextTokenメソッドを実装し、トークンを返すそのメソッドを呼び出すたびに、開始位置、トークンの長さ、および現在の入力テキスト (char バッファーとして) を取得したいと考えています。lexer ファイル内でこれらの値を取得するための関数をいくつか定義できると思いました (一種のコールバック関数などとして)。

これを機能させる方法はありますか?

4

1 に答える 1

1

yytextトークンの先頭を指します。使用する場合yy_scan_buffer( flex のマニュアルを参照)、flex は提供したバッファーをコピーせずに使用するため、バッファーをyytextポイントします。

インターフェイスを使用する場合は、flex を指定したバッファの末尾に2 つのNUL バイトを配置する必要があることに注意してください。yy_scan_bufferまた、トークンが 2 つの入力バッファーにまたがる場合は、自分で処理する必要があります。バッファを直接提供する場合に、入力バッファにまたがるトークンを flex がどのように処理するかは正確にはわかりませんが、提供した入力バッファを保持しながらそれを処理できる明らかな方法はありません。

于 2013-02-11T18:00:41.307 に答える