memorizzazione numeri di riga di espressioni con boost.spirit 2
-
22-09-2019 - |
Domanda
Sto pensando di fare un programma di utilità di script di trasformazione (per informazioni di diagnostica estesa) utilizzando Boost.Spirit 2.
Mentre non v'è il supporto per le informazioni linea ecc per l'analisi di errori, come posso memorizzare i numeri di riga per le espressioni analizzati con successo con Qi?
Soluzione
Come per la lista, Spirit.Classic noreferrer iteratori posizionali può essere utilizzato anche con Spirit 2 .
C'è anche un articolo su un iter_pos-parser sul Spirit -Blog.
I aggiornerà quando ho avuto il tempo di provare.
Altri suggerimenti
Mi rendo conto che ho notato la domanda in ritardo, ma permettetemi di aggiungere questo comunque. Ho scritto un campione di un file INI parser in un'altra risposta:
Questo utilizza un'azione 'semplice' semantica con line_pos_iterator
.
Ecco il frutto del mio lavoro: https://gist.github.com/1425972
- Quando
POSITIONINFO == 0
- ingresso è in streaming
- uscita è stringhe raw (beh,
map<string, map<string, string> >
per le sezioni)
-
Quando
POSITIONINFO == 1
- ingresso è bufferizzato
-
output è
textnode_t
:struct textnode_t { int sline, eline, scol, ecol; string_t text; };
Ciò significa che il
map<textnode_t, map<textnode_t, textnode_t> >
risultante è in grado di riferire esattamente quello (linea, col) punti iniziale e finale segnano i singoli nodi di testo.
Ecco una demo ridotta. Per una descrizione completa ed estesa casi di test vedere la anser originale o il codice a github
Demo ingresso
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
Demo uscita (POSITIONINFO == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
Demo uscita (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]
Qui è un altro articolo utile che spiega come utilizzare l'eccezione che la funzione phrase_parse
getta.
L'articolo descrive come ottenere messaggi di errore come questo:
Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
^- here