2011-01-17 20 views
6

Estoy buscando escribir un lexer usando boost :: spirit :: lex, pero todos los ejemplos que puedo encontrar parecen suponer que primero has leído el archivo completo en la memoria RAM. Me gustaría escribir un lexer que no requiera que toda la cadena esté en RAM, ¿es posible? ¿O necesito usar algo más?¿Cómo usar Boost :: Spirit :: Lex para leer un archivo sin leer todo el archivo en la memoria primero?

Intenté usar istream_iterator, pero boost me da un error de compilación a menos que use const char * como tipos de iterador.

p. Ej. Todos los ejemplos que puedo encontrar, básicamente, hacer esto:

lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

// assumes entire file is in memory 
char const* first = str.c_str(); 
char const* last = &first[str.size()]; 

bool r = lex::tokenize(first, last, lex_functor, 
    boost::bind(lex_callback_functor(), _1, ...)); 

Además, es posible determinar los números de línea/columna de fichas lex alguna manera?

Gracias!

Respuesta

6

Spirit Lex funciona con cualquier iterador siempre que cumpla con los requisitos de los iteradores estándar hacia adelante. Eso significa que puede alimentar al lexer (invocar lex::tokenize()) con cualquier iterador conforme. Por ejemplo, si desea utilizar un std::istream, podría envolverlo en un boost::spirit::istream_iterator:

bool tokenize(std::istream& is, ...) 
{ 
    lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

    boost::spirit::istream_iterator first(is); 
    boost::spirit::istream_iterator last; 

    return lex::tokenize(first, last, lex_functor, 
     boost::bind (lex_callback_functor(), _1, ...)); 
} 

y que iba a funcionar.

Para la segunda parte de su pregunta (relacionada con el número de línea/columna de la entrada): sí, es posible rastrear la posición de entrada utilizando el lexer. Aunque no es trivial. Necesita crear su propio tipo de token que almacena la información de línea/columna y usar esto en lugar del tipo de token predefinido. Mucha gente ha estado pidiendo esto, así que podría seguir adelante y crear un ejemplo.

+0

+1, sí, los nuevos ejemplos en la documentación de Spirit serían geniales :) – Viet

+1

Lo hice, en realidad. Boost V1.47 tendrá un tipo de token y un nuevo ejemplo que demuestre cómo usarlo. – hkaiser

+0

¡Gracias, Harmut! ¡Muy ansioso por la versión Boost 1.47 con el nuevo Spirit! – Viet

Cuestiones relacionadas