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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top