Boost :: spirit :: qi - 如何构建一个设置属性的解析规则?

时间:2017-12-06 19:44:47

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

我想构建一条规则,从解析的行中获取一些参数,然后将一些参数设置为常量。那可能吗?下面是一个(无效的)示例,用于说明我尝试做的事情。我想我在这里错误地使用_r1,但我不确定如何做正确的事情。假设我不想在将r发送到解析器之前修改#include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/qi_plus.hpp> #include <boost/spirit/include/qi_sequence.hpp> #include <boost/spirit/include/qi_string.hpp> #include <boost/spirit/include/phoenix_core.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/spirit/include/phoenix_object.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/adapted/struct/adapt_struct.hpp> #include <boost/phoenix/bind/bind_function.hpp> #include <string> using namespace boost::spirit::qi; struct Sample { int a; int b; }; BOOST_FUSION_ADAPT_STRUCT(Sample, a , b) const rule<std::string::const_iterator, Sample()> AnythingAndOne = int_ >> eps[_r1.b = 1] >> eoi; int main() { std::string z("3"); Sample r; parse(z.begin(), z.end(), AnythingAndOne, r); return 0; }

rust_primes --threads 8 --verbose --count 1000000
Options { verbose: true, count: 1000000, threads: 8 }
Non-concurrent using while (15485863): 2.814 seconds.
Concurrent using mutexes (15485863): 876.561 seconds.
Concurrent using channels (15485863): 798.217 seconds.

1 个答案:

答案 0 :(得分:1)

再次,参考Boost Spirit: "Semantic actions are evil"?我避免语义行为。

您可以使用qi::attr

直接合成特定的属性值

<强> Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>

struct Sample {
    int a;
    int b;
};
BOOST_FUSION_ADAPT_STRUCT(Sample, a , b)

namespace qi = boost::spirit::qi;

int main()
{
    std::string const z("3");
    Sample r;
    qi::rule<std::string::const_iterator, Sample()> AnythingAndOne
         = qi::int_ >> qi::attr(1) >> qi::eoi;

    if (parse(z.begin(), z.end(), AnythingAndOne, r))
        std::cout << "Parsed: " << boost::fusion::as_vector(r) << "\n";
    else
        std::cout << "Parse failed\n";
}

打印

Parsed: (3 1)