Можно ли использовать Boost.Spirit V2.x без Boost.Fusion? - PullRequest
0 голосов
/ 05 мая 2011

Действительно ли необходимо обертывать структуры / классы с помощью Boost.Fusion, чтобы использовать их с Boost.Spirit V2.x (особенно Boost.Spirit.Qi)? Я бы предпочел использовать семантические действия для назначения членам. Если моя память мне не помешает, то так было в V1.x ...

Пример калькулятора предполагает, что это все еще возможно. Пока что я не нашел хорошего способа сделать это.

Я бы хотел посмотреть, как вы это сделаете на примере сотрудник . Следующее не компилируется, но, возможно, есть какой-то способ заставить его работать:

template <typename Iterator>
struct employee_parser : qi::grammar<Iterator, employee(), ascii::space_type>
{
    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_[px::bind(&employee::age, qi::_val) = qi::_1] >> ','
            >>  quoted_string[px::bind(&employee::surname, qi::_val) = qi::_1] >> ','
            >>  quoted_string[px::bind(&employee::forename, qi::_val) = qi::_1] >> ','
            >>  double_[px::bind(&employee::salary, qi::_val) = qi::_1]
            >>  '}'
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
    qi::rule<Iterator, employee(), ascii::space_type> start;
};

1 Ответ

1 голос
/ 05 мая 2011

Не берите в голову, у меня все еще были старые печатные материалы для фьюжн.Забавно, как ошибки становятся намного легче найти после того, как вы опубликовали вопрос ...:)

(Поскольку это работает, я, должно быть, допустил еще одну ошибку в рабочем коде.)

...