2016-06-11 11 views
0

Ich versuche, die Grundlagen von Boost :: Spirit zu lernen, und es geht nicht gut. Ich versuche, einen einfachen "logischen und" Ausdruck in C++ Syntax geschrieben zu analysieren. Und aus irgendeinem Grund kann ich den Platz nicht zur Arbeit springen lassen.Boost :: Spirit: Basic "logische und" Ausdruck analysieren

meinen Code Hier ist bisher

template <typename Iterator> 
struct boolGrammar : public qi::grammar<Iterator, bool> 
{ 
public: 
    boolGrammar() : boolGrammar::base_type(expression) 
    { 
     andExpr = (qi::lit(L"1") >> qi::lit(L"&&") >> qi::lit(L"1"))[qi::_val = true]; 
    } 
    qi::rule<Iterator, bool> andExpr; 
}; 

bool conditionEvalAndParse(std::wstring condition) 
{ 
    boolGrammar<std::wstring::iterator> g; 
    bool result = false; 
    std::wstring::iterator it = condition.begin(); 
    bool parseResult = qi::phrase_parse(it, condition.end(), g, boost::spirit::standard_wide::space , result); 

    if (parseResult) { 
     return result; 
    } 
    else 
    { 
     std::wcout << L"Failed to parse condition " << condition << L". The following wasn't parsed : " << std::wstring(condition, it - condition.begin(), std::wstring::npos) << std::endl; 
     return false; 
    } 
} 

In meinem Test-Code, nenne ich:

conditionEvalAndParse(L"1&&1"); 
conditionEvalAndParse(L"1 && 1"); 

Und sicher genug, ich eine schöne Konsole Ausgabe:

"Failed to parse condition 1 && 1. The following wasn't parsed : 1 && 1" 

Jedermann Ist es wichtig, auf den Fehler eines Neulings hinzuweisen? :)

+0

ich eine ähnliche Frage vor einiger Zeit gefragt. Dies sollte für Sie hilfreich sein: http://stackoverflow.com/questions/14548592/boost-spirit-implement-small-one-line-dsl-on-a-server-application –

+0

Vielen Dank, es war wirklich! Ich habe den Skipper als Template-Parameter hinzugefügt, und es funktioniert. Ich nehme an, ohne sie ist meine Grammatik irgendwie zu einem falschen Space-Skipper geworden. –

Antwort

1

gelöst durch den Skipper als Template-Parameter hinzufügen, wie in @ Richard Hodges früheren Frage gesehen:

template <typename Iterator, typename Skipper = boost::spirit::standard_wide::space_type> 
struct boolGrammar : public qi::grammar<Iterator, bool, Skipper>