2017-12-01 9 views
1

ragelを見ると、ファイルを合理的に読み込む方法を理解できません。私が理解する限り、それはトークンの途中で壊れていないメモリバッファを必要とします。これは明らかに、特にトークンのサイズがわからない場合、実装するにはかなりの労力が必要です。文字列の改行、エスケープなどがあります。もし私がそれをすべて実装していれば、私はもうラーゲルが必要なのか分かりません。ragelはファイルに使用できないように設計されていますか?

良い方法はありますか?

答えて

1

ファイルをメモリにマップすると(mmap、CreateFileMapping)、ファイル全体が1つの連続したメモリチャンクとして使用できるようになります。

また、Ragel User Guide(5.9入力データへのポインタの更新)も参照してください。このポインタには、その状況を処理するためのサンプルコードがあります。固定バッファー・サイズを超える文字列またはトークンの場合、必要に応じて可変長バッファーを使用できます。

+0

ファイルマッピングシステムに依存しており、私はシュルありませんよe標準入力にどのように作用するか。私はragelをバイソンのためにレックスにしようとしています。私はそれが働いているが、私はコードが壊れやすいと感じる。すべてがフレックスよりもはるかに複雑です。空白やコメントを処理する。 – Mikolas

0

あなたが行っている解析の種類に左右されます。

ファイルの場合、ファイル全体をメモリにマップして処理することができます。

これは最適なオプションです。

チャンクでデータを読み取っても解析できますが、解析するコール全体で状態変数を追跡する必要があります。私は通常これをクラスに入れ、データのバッファを段階的に解析できるメソッドの解析を行うことでこれを行います。

データからトークンを抽出する場合は、戻す前にトークンを文字列に取り込む必要があります。解析を再開すると、トークンのマッチングが完了すると、前にマッチしたパーツと連結し、それが完全なトークンになります。最悪の場合、トークンバッファーは元のファイルほど大きくなることがあります。

あなたがここにこれのいくつかの例を見ることができます:

  1. をパーサはトークンの開始をマークし、まだそれを完了していない、それが格納されます場合:https://github.com/kurocha/async-http/blob/eff77f61f7a85a3ac21f7a8f51ba07f069063cbe/source/Async/HTTP/V1/RequestParser.rl#L52-L54
  2. パーサ状態が全体で保存されています解析するために呼び出します。https://github.com/kurocha/async-http/blob/eff77f61f7a85a3ac21f7a8f51ba07f069063cbe/source/Async/HTTP/V1/Parser.hpp#L57-L73
  3. データを読み取り、parseを呼び出すループ:https://github.com/kurocha/async-http/blob/eff77f61f7a85a3ac21f7a8f51ba07f069063cbe/source/Async/HTTP/V1/Protocol.cpp#L36-L54
関連する問題