У меня есть простой синтаксический анализатор конфигурации, построенный из spirit :: lex и spirit :: qi. Когда лексер достигает шаблона include "path"
Я хочу, чтобы текст файла был включен. Как вы знаете, дух :: лексер :: начать() запускает процесс сканирования:Как реализовать директивы include с помощью boost :: spirit :: lex?
// 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;
};
lexer будет распознан шаблон для include "path"
и в семантическом действии выберете путь к включенному файлу. Затем текущее лексерское состояние помещается в стек, содержимое файла загружается в строку, а новое состояние инициализируется, как указано выше, с помощью lexer :: begin().
Когда лексер находит символ EOF, стек выталкивается, а lexer :: begin() вызывается с использованием предыдущих переменных состояния лексера.
Можно ли повторно называть lexer :: begin() следующим образом? Как мне получить lex :: lexer для распознавания шаблона include "path"
и символа EOF без возврата маркера в парсер qi?
И, наконец, есть ли какие-либо альтернативные или лучшие способы достижения этого?