el almacenamiento de números de línea de expresiones con boost.spirit 2
-
22-09-2019 - |
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?
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