2016-07-11 13 views
1

scheitern könnte ich the Boost X3 Quick Start tutorial und bemerkte die Linieeps-Parser, der für eine „post-Initialisierung“ kann fehlschlagen, die

eps ist ein besonderer Geist Parser gerade lese, die keinen Eingang verbraucht aber ist immer erfolgreich. Wir verwenden es, um das synthetisierte Attribut der Regel zu initialisieren, vor allem anderen auf Null. [...] Unter Verwendung von eps ist dieser Weg gut für Pre- und Post-Initialisierungen.

Jetzt kann ich nicht helfen, aber frage mich, ob ein eps_that_might_fail nützlich wäre, eine Art semantischer/post-Analyse auf einem Teil des analysierten Eingang zu tun, die, scheitern könnte irgendeine Art von Ort der Prüfung zu haben, in der Grammatik.

Gibt es einen möglichen Fehler eps, und ist es eine gute Idee, zusätzliche Eingabeverifizierung mit diesem Konstrukt zu machen?

Ein schreckliches Beispiel dafür, was ich versuche zu vermitteln:

int_ >> eps_might_fail[is_prime] 

Dies wird nur analysieren Primzahlen, wenn ich mich nicht irre, und für den vollständigen Parser ermöglicht an dem Punkt zu scheitern, wo es erwartet eine Primzahl.

Antwort

4

Semantische Aktionen sind dafür gedacht.

Geist Qi

Die natürlichste Beispiel wäre

qi::int_ [ qi::_pass = is_prime(qi::_1) ] 

Seien Sie sicher, %= Regel Zuordnung in Gegenwart von semantischen Aktionen zu verwenden, denn ohne sie semantische Aktionen automatische Attribut Ausbreitung deaktivieren.

Sie könnten natürlich auch ausführlicher sein und schreiben

qi::int_ >> qi::eps(is_prime(qi::_val)) 

Wie Sie sehen können, dass die Dokumentation zitiert ist etwas unvollständig: eps einen Parameter bereits erfolgen kann, in diesem Fall der faulen Schauspieler is_prime(qi::_val), das bestimmt, ob es gelingt, zu scheitern.

Geist X3

In Spirit X3 der gleiche Mechanismus, mit der Ausnahme, dass X3 mit Phoenix nicht integrieren.Das bedeutet zweierlei:

  • auf der Aufwärtsseite, können wir nur Kernsprachfunktionen nutzen (Lambda) für semantische Aktionen, weniger die Lernkurve machen steile
  • auf der Kehrseite, gibt es keine 1-Argument Version einen faulen Schauspieler x3::eps die

Hier ist ein Demo-Programm mit X3 nimmt:

Live On Coliru

#include <boost/spirit/home/x3.hpp> 

namespace parser { 
    using namespace boost::spirit::x3; 

    auto is_ltua = [](auto& ctx) { 
     _pass(ctx) = 0 == (_attr(ctx) % 42); 
    }; 

    auto start = int_ [ is_ltua ]; 

} 

#include <iostream> 

int main() { 
    for (std::string const txt : { "43", "42", "84", "85" }) { 
     int data; 
     if (parse(txt.begin(), txt.end(), parser::start, data)) 
      std::cout << "Parsed " << data << "\n"; 
     else 
      std::cout << "Parse failed (" << txt << ")\n"; 
    } 
} 

Drucke

Parse failed (43) 
Parsed 42 
Parsed 84 
Parse failed (85) 
+0

Ouch I X3 spät bemerkt. Es ist ohne Zweifel ähnlich getroffen zu versuchen. – sehe

+1

Erweitert die Antwort mit X3 Demo, Differenz und Begründung! [Live On Coliru] (http://coliru.stacked-crooked.com/a/e7281f5ec19b6190) – sehe

+0

Super Antwort, danke :). Ich finde es schwierig, gute Ressourcen auf X3 zu finden (es scheint keine zu geben außer den cppnow2015 Folien und der Dokumentation ...). Danke, dass Sie eine wertvolle Ressource sind: D. – rubenvb