是否可以在没有Boost.Fusion的情况下使用Boost.Spirit V2.x?

时间:2011-05-05 01:20:15

标签: c++ boost boost-spirit boost-spirit-qi boost-fusion

是否真的有必要使用Boost.Fusion包装结构/类,以便将它们与Boost.Spirit V2.x(尤其是Boost.Spirit.Qi)一起使用?我宁愿使用语义动作来分配给成员。如果我的记忆力很好,那就是以前在V1.x中完成的方式......

calculator example表明它应该仍然可行。到目前为止,我还没有找到一个很好的方法来做到这一点。

我想看看你如何在employee example中做到这一点。以下内容不能编译,但也许有一些方法可以使它工作:

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 个答案:

答案 0 :(得分:1)

没关系,我仍然在那里有旧的融合印刷品。有趣的是,在你发布问题之后,错误变得如此容易找到......:)

(由于这有效,我必须在生产代码中犯了另一个错误。)