Boost::Spirit einfache Grammatik Beispiel
Werde ich durch die Boost-Spirit (und Boost-Fusion) tutorials (version 1.48.0). Ich habe das Spiel mit dem Spielzeug, Mitarbeiter Beispiel. Der link zur Quelle ist hier:
http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp
Hier ist der Beispiel-Grammatik:
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, employee(), ascii::space_type> start;
Und meine Modifikationen entfernen, die Behandlung der Anführungszeichen und genau analysiert, alle Zeichen zwischen den Trennzeichen und ordnet, dass die Struktur der parser zugeordnet ist.
//quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> +(char_) >> ','
>> +(char_) >> ','
>> double_
>> '}'
;
Meine Vermutung ist, dass char_ umfasst alle Zeichen bis zu einem Komma erreicht ist. Jedoch, kompilieren und ausführen mit dem folgenden string gibt einen Fehler zu analysieren.
./employee
employee{10,my,name,20.0}
-------------------------
Parsing failed
-------------------------
Bin ich auch versucht zu schreiben, eine ähnliche parser automatisch eine Umwandlung in die entsprechenden Typen der meine struct-Typ. Ich bin sicher, ich bin fehlt etwas grundlegend falsch, so weit, wie die Definition der richtigen Grammatik für ein input-string wie oben, so jede Hilfe wird sehr geschätzt!
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
+(char_)
verbraucht ein oder mehrere char, so wird es auch konsumieren, Kommas und wird niemals zu>> ','
. Es ist gierig.Sollten Sie schreiben
+(char_ - ',')
mit Differenz-operators-
:Parser
+(char_ - ',')
verbrauchen würde jeden char bis zum Komma ist erreicht. Danach wird es zu bewegen, um>> ','
, zu verzehren und dann weiter mit der nächsten Zeile+(char_ - ',')
bis Komma und so weiter.Mehr zu diesem operator finden Sie hier: http://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/operator/difference.html
ODER
Wenn Sie wollen, um zu analysieren, Namen, die nur enthält Buchstaben, können Sie auch prüfen, schreiben parser, die nur akzeptieren, Buchstaben: