(! $ 23 && $ 45) || ! $ 67 < /p>
И, возможно, более общий, как < /p>
Код: Выделить всё
!($1 && $2 && $3) || (!$4 && $5) && $6)
< /code>
К сожалению, я использую VisualStudio 2010 с старой версией Boost 1.67, так что нет STD C ++ 11 доступен < /p>
Я начинаю с простого до правильного анализа, таких как $ (т. Е. Например, $ 89) и определение грамматической системы. Правила, с которыми я в конечном итоге, были эти: < /p>
stepid = long_[ref(longv) = _1, _val = _1];
stepref = (lit("$") >> stepid)[phx::bind(&evaluate_step, &longv, &boolv), _val = ref(boolv) ];
< /code>
, где Longv и Boolv являются двумя атрибутами грамматики (Long и Bool), а оценка_теп является простой глобальной функцией с этой подписью < /p>
void evaluate_step(const long* s, bool* b)
< /code>
Далее я определил правило для определения фактора < /p>
factor = stepref[_val = _1] | "!" >> stepref[_val = !_1];
< /code>
Эти три правила могут разрабатывать без ошибок, такие как 45 долларов и!term = factor[_val = _1] | (factor[_val = _1] >> "&&" >> factor)[_val = _val && _1];
< /code>
, чтобы разобрать строки, такие как "$ 2 &&! 3 $". Я пытаюсь проанализировать «$ 32 && $ 33». Ниже вы можете найти весь грамматический код и как он используется. < /P>
template
struct composite : qi::grammar
{
composite() : composite::base_type(start)
{
using qi::lit;
using qi::_val;
using qi::_1;
using qi::_2;
using qi::_3;
using qi::_4;
using qi::long_;
using ascii::char_;
using phx::ref;
using phx::val;
stepid = long_[ref(longv) = _1, _val = _1];
stepref = (lit("$") >> stepid)[phx::bind(&evaluate_step, &longv, &boolv), _val = ref(boolv) ];
term = factor[_val = _1] |
(factor[_val = _1] >> "&&" >> factor)[_val = _val && _1];
factor = stepref[_val = _1] |
"!" >> stepref[_val = !_1];
start = term[_val = _1];
}
qi::rule stepid;
qi::rule stepref;
qi::rule term;
qi::rule factor;
qi::rule start;
long longv;
bool boolv;
};
int _tmain(int argc, _TCHAR* argv[])
{
using boost::spirit::ascii::space;
std::string expr = "$32 && $33";
composite c;
bool result = false;
std::string::iterator iter = expr.begin();
std::string::iterator end = expr.end();
bool r = phrase_parse(iter, end, c, space, result);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79663402/why-qi-parser-stops-before-text-end[/url]