2011-01-17 11 views
6

私はboost :: spirit :: lexを使ってレクサーを書いていますが、私が見つけることができるすべての例は、まずファイル全体をRAMに読み込んだと仮定しているようです。 RAM全体に文字列全体を必要としないレクサーを書いてみたいと思いますか?それとも別のものを使う必要がありますか?Boost :: Spirit :: Lexを使ってファイル全体を最初にメモリに読み込まずにレックスする方法は?

私はistream_iteratorを使用しようとしましたが、反復子の型としてconst char *を使用しない限り、boostは私にコンパイルエラーを与えます。

私が見つけることができるすべての例は、基本的にこれを行います:また、どのようにしてlexトークンから行番号/列番号を決定することはできますか?

ありがとうございます!

答えて

6

Spirit Lexは、標準の順方向イテレータの要件に準拠している限り、任意のイテレータで動作します。つまり、レクサー(呼び出すlex::tokenize())に適合するイテレータを供給することができます。

bool tokenize(std::istream& is, ...) 
{ 
    lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

    boost::spirit::istream_iterator first(is); 
    boost::spirit::istream_iterator last; 

    return lex::tokenize(first, last, lex_functor, 
     boost::bind (lex_callback_functor(), _1, ...)); 
} 

をし、それが働くだろう:たとえば、あなたがstd::istreamを使用したい場合、あなたはboost::spirit::istream_iteratorにそれをラップすることができます。

質問の2番目の部分(入力の行/列番号に関する):はい、レクサーを使用して入力位置を追跡することは可能です。しかし、それは自明ではありません。行/列情報を格納する独自のトークンタイプを作成し、事前定義されたトークンタイプの代わりにこれを使用する必要があります。多くの人々がこれを求めているので、私は先に進んで例を作成するかもしれません。

+0

+1、はい、スピリットドキュメントの新しい例は素晴らしいでしょう:) – Viet

+1

私はそれを実際に行いました。 Boost V1.47には、このようなトークンタイプと、それを使用する方法を示す新しい例があります。 – hkaiser

+0

ありがとうございました!新しいスピリットでブースト1.47のリリースを楽しみにしています! – Viet

関連する問題