Boost Spirit X3 kann keine Wiederholungsanweisung mit variablem Faktor kompilieren

8

Ich versuche, die Boost Spirit X3-Direktive wiederhole mit einem Wiederholungsfaktor zu verwenden, der variabel ist. Die Grundidee ist eine Header + Payload, wobei der Header die Größe der Payload angibt. Ein einfaches Beispiel "3 1 2 3" wird interpretiert als header = 3, data = {1, 2, 3} (3 ganze Zahlen).

Ich konnte nur Beispiele aus der spirit qi Dokumentation finden. Es verwendet boost phoenix referenz, um den variablen Faktor zu umhüllen: Ссылка

%Vor%

Ich schrieb das folgende einfache Beispiel für Geist x3 ohne Glück:

%Vor%

Das Kompilieren des obigen Codes mit Boost 1.59.0 und clang ++ (Flags: -std = C ++ 14) gibt folgend:

%Vor%

Wenn ich repeat(3) anstelle von repeat(boost::phoenix::ref(n)) fest codiere, funktioniert es richtig, aber es ist keine mögliche Lösung, da es einen variablen Wiederholungsfaktor unterstützen sollte.

Die Kompilierung mit repeat(n) wird erfolgreich abgeschlossen, aber die Analyse mit der folgenden Ausgabe schlägt fehl: “Parse failed, remaining: 1 2 3"

Betrachtet man den Quellcode für boost/spirit/home/x3/directive/repeat.hpp:72 , ruft er den leeren Konstruktor für den Templatyp RepeatCountLimit::type variable i auf und weist ihn dann während der for-Schleife zu, wobei er über min und max iteriert. Da der Typ jedoch eine Referenz ist, sollte er im Konstruktor initialisiert werden, so dass die Kompilierung fehlschlägt. Betrachtet man den entsprechenden Quellcode aus der vorherigen Bibliotheksversion boost / spirit / home / qi / directive / repeat.hpp: 162, wird er direkt zugewiesen:

%Vor%

Ich bin mir nicht sicher, was ich hier falsch mache, oder ob x3 derzeit keine variablen Wiederholungsfaktoren unterstützt. Ich würde etwas Hilfe bei der Lösung dieses Problems begrüßen. Danke.

    
Guilherme Schlinker 10.11.2015, 06:29
quelle

1 Antwort

7

Von dem, was ich erfahre, die Quelle und die Mailingliste lies, ist Phoenix überhaupt nicht in X3 integriert: Der Grund dafür ist, dass C ++ 14 das meiste davon überflüssig macht.

Ich stimme zu, dass dadurch einige Stellen übrig bleiben, an denen Qi elegante Lösungen, z. eps(DEFERRED_CONDITION) , lazy(*RULE_PTR) (der Nabialek-Trick ), und tatsächlich, das Fall.

Spirit X3 ist noch in der Entwicklung, also könnten wir das hinzugefügt sehen¹

Fürs Erste hat Spirit X3 eine verallgemeinerte Möglichkeit für statusbehafteten Kontext. Dies ersetzt im Wesentlichen locals<> , in einigen Fällen vererbte Argumente und kann / validiert / validiert die Anzahl der Elemente in diesem speziellen Fall:

  • x3::with ²

So können Sie es verwenden:

%Vor%

Hier ist _n ein Tag-Typ, der das Kontextelement zum Abruf mit get<_n>(cxtx) identifiziert.

  

Beachten Sie, dass momentan einen Referenz-Wrapper für einen L-Wert n verwenden müssen, weil with<_n>(0u) zu einem konstanten Element im Kontext führen würde. Ich nehme an, dass dies auch eine QoI ist, die aufgehoben werden kann, wenn X # reift

Nun zu den semantischen Aktionen:

%Vor%

Dies speichert die geparste vorzeichenlose Zahl im Kontext. ( In der Tat, wegen der ref(n) -Bindung ist es nicht wirklich Teil des Kontexts für jetzt, wie erwähnt )

%Vor%

Hier prüfen wir, ob wir tatsächlich nicht "voll" sind - d. h. mehr ganze Zahlen sind erlaubt

%Vor%

Hier überprüfen wir, ob wir "voll" sind - d. h. nein mehr ganze Zahlen sind erlaubt .

Alles zusammensetzen:

Live auf Coliru %Vor%

Welche Drucke:

%Vor%

¹ unterstütze / stimme auf der Mailingliste [spirit-general]:)

² kann keine geeignete Dokumentationsverknüpfung finden, wird aber in einigen Beispielen verwendet

    
sehe 10.11.2015, 10:34
quelle