boost :: spirit:语义动作块中的多个语句

时间:2013-02-20 20:55:05

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

boost :: phoenix使用运算符“,”定义语句块(参见boost phoenix block statements)。我试图在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:a = 0,b = 2

但我期待a = 1,b = 2。这是它应该如何工作?为什么呢?

谢谢!

1 个答案:

答案 0 :(得分:4)

鉴于编译时间永远不会是快速使用Spirit,我建议坚持使用实用程序库的'highlevel includes':

#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 e.a.或boost/range/algorithm.hpp

您的里程可能会有所不同,但TU定义的Spirit解析器通常不是我项目中编译时间优化的重点。