【问题标题】:boost::spirit: multiple statements in semantic action blockboost::spirit:语义动作块中的多个语句
【发布时间】:2013-02-06 00:54:11
【问题描述】:

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。这是它应该如何工作的吗?为什么?

谢谢!

【问题讨论】:

  • 试试#include &lt;boost/spirit/include/phoenix_statement.hpp&gt;
  • @ildjarn 实际上,应该是phoenix_operator.hpp,但它已经存在了。
  • 好的,我撤销:包含 phoenix_statement.hpp 确实解决了问题。
  • 感谢 @ildjam 和 sehe 提供的解决方案和使用“最高”包括的建议。我想我永远不会自己解决这个问题:)

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


【解决方案1】:

鉴于使用 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 e.a. 或 boost/range/algorithm.hpp

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多