gpt4 book ai didi

c++ - boost::spirit:语义 Action block 中的多个语句

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:15 27 4
gpt4 key购买 nike

boost::phoenix 使用运算符“,”定义语句 block (参见 boost phoenix block statements )。我试图在 boost::spirit 规则的语义 Action 部分使用这个构造。但是,看起来只执行了语句 block 中的最后一条语句。这是一个显示问题的最小可编译示例:

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

谢谢!

最佳答案

鉴于使用 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

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

关于c++ - boost::spirit:语义 Action block 中的多个语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com