Tengo un analizador de archivos de configuración simple construido de spirit :: lex y spirit :: qi. Cuando el lexer alcanza el patrón include "path"
, quiero que se incluya el texto del archivo. Como ya sabrán, el espíritu :: lexer :: begin() inicia el proceso de escaneado:¿Cómo implemento incluir directivas usando 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);
Mi idea es tener una pila que almacena el estado lexer representa como una estructura:
struct LexerState
{
const char* first;
const char* last;
std::string contents;
};
El lexer se haría para reconocer el patrón para include "path"
y en una acción semántica extraer la ruta al archivo de inclusión. Luego, el estado actual del lexer se inserta en la pila, los contenidos del archivo se cargan en una cadena y el nuevo estado se inicializa como se indica más arriba utilizando lexer :: begin().
Cuando el lexer encuentra el carácter EOF, se salta la pila y se llama a lexer :: begin() utilizando las variables de estado lexer anteriores.
¿Está bien llamar repetidamente a lexer :: begin() de esta manera? ¿Cómo obtengo lex :: lexer para reconocer el patrón include "path"
y el carácter EOF sin devolver un token al analizador qi?
Finalmente, ¿hay alguna forma alternativa o mejor de lograr esto?