boost :: spirit: несколько операторов в блоке семантического действия

boost :: phoenix определяет блоки операторов с помощью оператора «,» (см. повысить блок заявления Феникс). Я пытаюсь использовать эту конструкцию в семантической части действия правила boost :: spirit. Тем не менее, похоже, что выполняется только последний оператор в блоке операторов. Вот минимальный компилируемый пример, который показывает проблему:

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

int main()
{
using boost::spirit::qi::int_;
using boost::phoenix::ref;
using boost::spirit::qi::phrase_parse;
using boost::spirit::ascii::space;

int a = 0;
int b = 0;

const std::string s("1");
bool f = phrase_parse(s.begin(),s.end(),
int_[
ref(a)=1,
ref(b)=2
],
space);
std::cout << f << ": a=" << a << ", b=" << b << std::endl;
}

Эта программа (используя boost 1.52) печатает

1: а = 0, б = 2

но я ожидал а = 1, б = 2. Это как это должно работать? Зачем?

Спасибо!

4

Решение

В свете того факта, что компиляции никогда не будут быстрый используя Spirit, я бы предложил придерживаться «включений высокого уровня» для служебных библиотек:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

int main()
{
namespace qi = boost::spirit::qi;

int a = 0, b = 0;

const std::string s("1");
bool f = qi::phrase_parse(s.begin(),s.end(),
qi::int_[
boost::phoenix::ref(a)=1,
boost::phoenix::ref(b)=2
],
qi::space);
std::cout << f << ": a=" << a << ", b=" << b << std::endl;
}

Также я обычно предлагаю boost/fusion/adapted.hpp над boost/fusion/adapted/struct.hpp например, или boost/range/algorithm.hpp,

Ваш пробег может варьироваться, но определяющие парсеры Spirit в TU обычно не имеют смысла оптимизировать время компиляции в моих проектах.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]