私は、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 文字を認識させるにはどうすればよいですか?
最後に、これを達成するための代替またはより良い方法はありますか?