Frage

Ich plane, ein Skript-Transformation-Programm (für erweiterte Diagnoseinformationen) auf dem Handeln mit Boost.Spirit 2.

Zwar gibt es Unterstützung für Online-Informationen usw. für Fehler Parsen, wie ich Zeilennummern für erfolgreich analysiert Ausdrücke mit Qi speichern kann?

War es hilfreich?

Lösung

Gemäß der Mailing-Liste, Spirit.Classic Positions Iteratoren kann auch mit Spirit 2 .
verwendet werden Es gibt auch einen Artikel über eine iter_pos-Parser auf die Geist -blog.

Ich werde aktualisieren, wenn ich Zeit zum Test habe.

Andere Tipps

Ich weiß, ich die Frage spät bemerkt, aber lassen Sie mich diese ohnehin hinzuzufügen. Ich schrieb eine Probe von einem INI-Datei-Parser in einer anderen Antwort:

Diese nutzt eine 'einfache' semantische Aktion mit line_pos_iterator.

Hier ist die Frucht meiner Arbeit: https://gist.github.com/1425972

  • Wenn POSITIONINFO == 0
    • Eingang Streaming
    • Ausgang ist rohe Strings (na ja, map<string, map<string, string> > für die Abschnitte)
  • Wenn POSITIONINFO == 1

    • Eingang gepuffert
    • Ausgang ist textnode_t:

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

      Das bedeutet, dass der resultierende map<textnode_t, map<textnode_t, textnode_t> > der Lage ist, genau zu berichten, was (Zeile, Spalte) die Start- und Endpunkte markieren die einzelnen Textknoten.

Hier ist eine reduzierte Demo. Ausführliche Textbeschreibung und umfangreiche Testfälle finden Sie unter die ursprüngliche anser oder der Code unter github

Demo Eingabe

[Cat1]
name1=100 #skipped

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

Demo-Ausgang (POSITIONINFO == 0)

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

Demo-Ausgang (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]

Hier Artikel ist ein weiterer nützlicher, die erklären, wie die Ausnahme verwenden, dass die phrase_parse Funktion löst.

Der Artikel beschreibt, wie Fehlermeldungen wie diese bekommen:

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top