Pregunta

Estoy pensando en hacer una utilidad de transformación Script (para información de diagnóstico extendido) usando Boost.Spirit 2.

Si bien no hay soporte para información de línea, etc., para analizar los errores, cómo puedo almacenar números de línea para expresiones analizado correctamente con Qi?

¿Fue útil?

Solución

De acuerdo con la lista de correo, Spirit.Classic posicional iteradores también se puede utilizar con Spirit 2 .
También hay un artículo sobre un iter_pos-analizador en el Espíritu -Blog.

Voy a actualizar cuando tuve tiempo de prueba.

Otros consejos

Me da cuenta me di cuenta de la cuestión tarde, pero permítanme añadir esto de todos modos. Escribí una muestra de un archivo del analizador INI en otra respuesta:

Este sistema utiliza una acción semántica 'simple' con line_pos_iterator.

Este es el fruto de la obra: https://gist.github.com/1425972

  • Cuando POSITIONINFO == 0
    • de entrada se transmite
    • salida es cuerdas primas (bueno, map<string, map<string, string> > para las secciones)
  • Cuando POSITIONINFO == 1

    • entrada está tamponada
    • salida es textnode_t:

      struct textnode_t {
          int sline, eline, scol, ecol;
          string_t text;
      };
      

      Esto significa que el map<textnode_t, map<textnode_t, textnode_t> > resultante es capaz de informar exactamente lo que (línea, columna) puntos inicial y final marcan los nodos de texto individuales.

He aquí una demostración reducida. Para una descripción completa y casos de prueba extensas ver la anser original o el código en github

Demostración de entrada

[Cat1]
name1=100 #skipped

name2=200 \#not \\skipped
name3=   dhfj dhjgfd

Demostración de salida (POSITIONINFO == 0)

Parse success!
[Cat1]
name1 = 100 
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd

Demostración de salida (POSITIONINFO == 1)

Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]

Aquí es otro artículo útil que explica cómo utilizar la excepción de que la función phrase_parse lanza.

El artículo describe cómo obtener mensajes de error como este:

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top