Ich bin zwischen einer tiefen Bewunderung über Boost :: Geist und ewiger Frustration, um es nicht zu verstehen;)
Ich habe Probleme mit Strings, die zu gierig sind und daher nicht passen. Unterhalb eines minimalen Beispiels, das nicht analysiert wird, da die txt-Regel das Ende auffrisst.
Weitere Informationen zu dem, was ich tun möchte: Das Ziel ist es, etwas Pseudo-SQL zu parsen und Whitespaces zu überspringen. In einer Aussage wie
%Vor% Ich muss from
als spezielles Keyword behandeln. Die Regel ist so etwas wie
aber es funktioniert offensichtlich nicht bei es sieht bar.id from foo
als ein Element.
Hier ist meine Version, mit Änderungen markiert:
%Vor%Dies kompiliert und läuft mit GCC 4.4.3 und Boost 1.4 etwas; Ausgabe:
%Vor% Wenn Sie lexeme
verwenden, können Sie vermeiden, dass Leerzeichen bedingt verwendet werden, sodass txt
nur einer Wortgrenze entspricht. Dies ergibt das gewünschte Ergebnis: Weil "Baz"
nicht von einem Komma gefolgt ist und txt
keine Leerzeichen verbraucht, konsumieren wir niemals versehentlich "end"
.
Wie auch immer, ich bin mir nicht 100% sicher, dass Sie das suchen - insbesondere ist str
fehlende Leerzeichen als illustratives Beispiel oder sind Sie irgendwie gezwungen, dieses (spaceless) Format zu verwenden?
Randnotiz: Wenn Sie sicherstellen möchten, dass Sie die gesamte Zeichenfolge analysiert haben, fügen Sie eine Überprüfung hinzu, um zu sehen, ob begin == str.end()
. Wie bereits erwähnt, meldet Ihr Code eine Übereinstimmung, auch wenn nur ein nicht leeres Präfix von str
analysiert wurde.
Update: Suffixdruck hinzugefügt.
Tags und Links c++ boost-spirit