2016-07-22 16 views
2

ich einen String in eine Struktur mit boost Geist x3 zu analysieren versuchen:Parsing eine Liste von Strings durch eine Liste von Strings mit Geist x3 gefolgt

struct identifier { 
    std::vector<std::string> namespaces; 
    std::vector<std::string> classes; 
    std::string identifier; 

}; 

jetzt habe ich eine Parser-Regel einen Strings passen wie dies:

foo::bar::baz.bla.blub 
foo.bar 
boo::bar 
foo 

meine Parserregel sieht so aus.

auto const nested_identifier_def = 
     x3::lexeme[ 
       -(id_string % "::") 
       >> -(id_string % ".") 
       >> id_string 
     ]; 

wo id_string Kombinationen von alphanum analysiert. Ich weiß, dass diese Regel nicht funktioniert, um zu analysieren, wie ich es will, weil während der Analyse foo.bar zum Beispiel dieser Teil der Regel -(id_string % ".") die gesamte Zeichenfolge verbraucht. Wie kann ich die Regel ändern, um korrekt in der Struktur zu analysieren?

Antwort

3

Angenommen, Ihre id_string ist so etwas wie dieses:

auto const id_string = x3::rule<struct id_string_tag, std::string>{} = 
    x3::lexeme[ 
      (x3::alpha | '_') 
     >> *(x3::alnum | '_') 
    ]; 

dann denke ich, das, was Sie ist sind nach:

auto const nested_identifier_def = 
     *(id_string >> "::") 
    >> *(id_string >> '.') 
    >> id_string; 

Online Demo

Das Problem ist, dass p % delimit ist Kurzschrift für p >> *(delimit >> p), dh es verbraucht immer einen pnach das Trennzeichen. Was Sie jedoch wollen, ist *(p >> delimit), so dass keine nach dem Trennzeichen verbraucht wird und stattdessen für die nächste Regel übrig ist.

Verwandte Themen