2012-05-09 7 views
6

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?

Respuesta

3

Tener un vistazo a cómo Boost Wave hace cosas:

La biblioteca preprocesador Wave C++ utiliza la biblioteca de la construcción Spirit analizador para implementar un analizador léxico C++ con las normas ANSI/ISO capacidades de procesamiento previo conformes. Expone una interfaz de iterador, que devuelve el token preprocesado actual de la secuencia de entrada. Este token preprocesado se genera sobre la marcha mientras se itera sobre la secuencia del iterador del preprocesador (en la terminología del STL estos iteradores son iteradores hacia adelante).

Y con respecto a características:

preprocesador El C++ proporciona cuatro instalaciones separadas que se pueden utilizar como mejor le parezca:

  • Inclusión de archivos de cabecera
  • expansión Macro
  • Compilación condicional
  • Control de línea

Su Quick Start Sample muestra cómo se tendría que utilizar Boost interfaz léxico de la onda.

Cuestiones relacionadas