2011-05-11 11 views
11

Estoy escribiendo un analizador para archivos de configuración bastante complicados que utilizan sangría, etc. Decidí usar Lex para dividir la entrada en tokens, ya que parece facilitar la vida. El problema es que no puedo encontrar ningún ejemplo del uso de herramientas de informes de errores de Qi (on_error) con analizadores que operan en la secuencia de tokens en lugar de caracteres.Boost.Spirit: informe de error Lex + Qi

El controlador de errores que se utilizará en on_error requiere algunos para poder indicar exactamente dónde está el error en la secuencia de entrada. Todos los ejemplos solo construyen std::string del par de iteradores y los imprimen. Pero si se usa Lex, los iteradores son iteradores de la secuencia de tokens, no de caracteres. En mi programa esto llevó a colgar en el constructor std::string antes de que notara el tipo de iterador no válido.

Como lo entiendo token puede contener un par de iteradores a la secuencia de entrada como su valor. Este es el tipo de atributo predeterminado (si el tipo es como lex::lexertl::token<>). Pero si quiero que mi token contenga algo más útil para el análisis (int, std::string, etc.), esos iteradores se pierden.

¿Cómo puedo generar mensajes de error que indiquen la posición en el flujo de entrada mientras utilizo Lex con Qi? ¿Hay algún ejemplo de tal uso?

Gracias.

+0

@justsomebody gracias por la edición :) – sehe

Respuesta

10

Perdón por la respuesta tardía, pero me tomó algo de tiempo preparar un ejemplo decente de lo que está tratando de lograr. Ahora agregué un nuevo ejemplo de Lexer a Spirit: conjure_lexer. Es una versión modificada del ejemplo conjure (Qi) que implementa un pequeño lenguaje de programación. La principal diferencia es que está utilizando un lexer en lugar de una gramática Qi pura.

El nuevo conjure_lexer ejemplo demuestra varias cosas: a) es el uso de una nueva clase position_token, que se extiende la token tipo existente. Siempre almacena el par de iteradores que apuntan a la secuencia de entrada coincidente correspondiente (además de la información habitual, como ID de token, valor de token, etc.). b) está utilizando esta información posicional para el informe de errores c) y, a lo largo de las líneas, demuestra cómo el uso de un lexer puede simplificar la gramática.

El nuevo ejemplo está en SVN (troncal) y estará disponible en Boost V1.47 (se lanzará pronto). Está en este directorio: $ BOOST_ROOT/libs/spirit/example/qi/compiler-tutorial/conjure_lexer.

+0

Muchas gracias, Hartmut! –

+2

Solo una actualización: el ejemplo ha sido renombrado en SVN para conjure2. – hkaiser

Cuestiones relacionadas