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? :)
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 –
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. –