2016-08-02 14 views
1

Ich habe gerade mit Spirit X3 begonnen und habe eine kleine Frage zu meinem ersten Test. Weißt du, warum diese Funktion "falsch" zurückgibt?Starten mit Spirit X3

bool parse() 
{ 
    std::string rc = "a 6 literal 8"; 

    auto iter_begin = rc.begin(); 
    auto iter_end = rc.end(); 

    bool bOK= phrase_parse(iter_begin, iter_end, 
          // ----- start parser ----- 

          alpha >> *alnum >> "literal" >> *alnum 

          // ----- end parser ----- 
          , space); 

    return bOK && iter_begin == iter_end; 
} 

Ich habe gesehen, das Problem hängt damit zusammen, wie ich die Grammatik schreibe. Wenn ich es mit diesem ersetzen, gibt es „true“

alpha >> -alnum >> "literal" >> *alnum 

Ich bin mit dem Geist Version in Boost-1.61.0 enthalten.

Vielen Dank im Voraus,

Sen

+0

Hier können Sie den Code testen online: http://coliru.stacked-crooked.com/a/0ce333c6e9f75f66 – Sen

Antwort

0

Ihr Problem ist eine Kombination aus der Gefräßigkeit des Betreibers * und die Verwendung eines Skipper. Sie müssen bedenken, dass alnum ein PrimitiveParser ist und das bedeutet, dass dieser Parser vor jeder Zeit versucht wird, Geist wird vorge überspringen und so das Verhalten des Parsers ist:

  • alpha parst a.
  • Der Kleene-Operator wird gestartet.
  • alnum überspringt den Raum und analysiert dann 6.
  • alnum überspringt den Raum und analysiert dann l.
  • alnum analysiert i.
  • ...
  • alnum analysiert l.
  • alnum überspringt den Raum und analysiert dann 8.
  • alnum versucht und fehlschlägt, mehr zu analysieren. Dies schließt den Kleene-Operator mit einem geparsten Attribut von 6literal8 ab.
  • "literal" versucht und fehlschlägt zu analysieren.
  • Der Sequenzoperator schlägt fehl und der Aufruf phrase_parse gibt false zurück.

Sie können dieses Problem leicht mit der lexeme Richtlinie (barebones x3 docs, qi docs) vermeiden. So etwas wie this sollte funktionieren:

alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum]; 
Verwandte Themen