6

私は、spirit::lex と spirit::qi から構築された単純な構成ファイル パーサーを持っています。レクサーがパターンinclude "path"に到達したら、ファイルのテキストを含める必要があります。ご存じのとおり、spirit::lexer::begin() はスキャン プロセスを開始します。

// Read file contents into a std::string
...

// _first and _last are const char*
_first = _contents.c_str();
_last  = &_first[_input.size()];

// _token is a lexer::iterator_type for the current token
_token = _lexer.begin(_first, _last);

私の考えは、構造体として表されるレクサー状態を格納するスタックを持つことです:

struct LexerState
{
    const char* first;
    const char* last;
    std::string contents;
};

字句解析器は、パターンを認識include "path"し、セマンティック アクションでインクルード ファイルへのパスを抽出します。次に、現在のレクサー状態がスタックにプッシュされ、ファイルの内容が文字列にロードされ、lexer::begin() を使用して上記のように新しい状態が初期化されます。

レクサーが EOF 文字を検出すると、スタックがポップされ、前のレクサー状態変数を使用して lexer::begin() が呼び出されます。

このように lexer::begin() を繰り返し呼び出しても大丈夫ですか? include "path"qi パーサーにトークンを返さずに lex::lexer にパターンと EOF 文字を認識させるにはどうすればよいですか?

最後に、これを達成するための代替またはより良い方法はありますか?

4

1 に答える 1

3

Boost Waveがどのように機能するかを見てみましょう。

WaveC++ プリプロセッサ ライブラリは、パーサー構築ライブラリを使用して、SpiritISO/ANSI 標準に準拠した前処理機能を備えた C++ レクサーを実装します。これは、入力ストリームから現在の前処理されたトークンを返す反復子インターフェイスを公開します。この前処理されたトークンは、プリプロセッサのイテレータ シーケンスを反復処理しながらオンザフライで生成されます (STL の用語では、これらのイテレータは前方イテレータです)。

そして機能に関して:

C++ プリプロセッサは、必要に応じて使用できる 4 つの個別の機能を提供します。

  • ヘッダファイルのインクルード
  • マクロ展開
  • 条件付きコンパイル
  • ラインコントロール

Quick Start Sampleは、Boost Wave のレクサー インターフェイスの使用方法を示しています。

于 2012-05-10T10:42:17.300 に答える