Boost Spirit ist zu gierig

8

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

%Vor%

aber es funktioniert offensichtlich nicht bei es sieht bar.id from foo als ein Element.

%Vor%     
Tristram Gräbener 18.03.2011, 17:31
quelle

1 Antwort

10

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.

    
phooji 18.03.2011, 18:01
quelle

Tags und Links