У меня есть простой анализатор файлов конфигурации, созданный из 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() вот так? Как заставить lex::lexer распознавать шаблон include "path"
и символ EOF, не возвращая токен парсеру qi?
Наконец, есть ли альтернативные или лучшие способы сделать это?