在boost :: spirit :: x3

时间:2019-03-14 14:56:01

标签: c++ boost boost-spirit-x3

我正在尝试使用boost :: spirit :: x3创建一个解析器,偶然发现一个奇怪的问题。尽管Joel de Guzman和Michael Caisse(https://ciere.com/cppnow15/)的“使用X3”文档中介绍了这种特殊用例,但似乎并非所有宣传的功能都可以使用。

问题在于,Spirit X3显然在合成元组属性(如std :: pair)时遇到困难。因此,以下构造声称产生具有一对字符串类型的属性:

auto item = rule<class item, std::pair<std::string, std::string>>() 
          = name >> ’:’ >> ( quote | name );

典型例子:

#include <iostream>
#include <vector>
#include <boost/spirit/home/x3.hpp>

using namespace std;

namespace x3 = boost::spirit::x3;

using x3::int_;

int main()
{
    string input = "foo: 146                \n"
                   "the_answer: 42          \n"
                   "freeze_point: 0         \n";

    cout << input << endl << endl;

    auto identifier = x3::rule<class identifier, string>()
            = x3::lexeme[(x3::alpha | '_') >> *(x3::alnum | '_')];

    auto key_value_pair = x3::rule<class key_value_pair, pair<string, int>>()
            = identifier >> ':' >> int_;

    auto first = input.begin();
    auto last = input.end();

    vector<pair<string, int>> output;

    bool result = x3::phrase_parse(first, last, *(key_value_pair), x3::space, output);
    cout << endl << "Result:" << result << endl << (first - input.begin()) << " of " << (last - input.begin());

    return 0;
}

在coliru上直播:     http://coliru.stacked-crooked.com/a/8980ba6215ae0ce7

此代码无法编译,编译器抱怨试图将一个int分配给一对。为什么Spirit这样做而不是提取两个值(分别为string和int)并将它们成对?不知道这是否是boost :: spirit :: x3中的错误,也许我做错了。

编译器尝试过:apple-clang,GCC,MSVC17。 Boost版本为1.66或1.69。

1 个答案:

答案 0 :(得分:0)

您缺少包含项:

#include <boost/fusion/adapted/std_pair.hpp>

其中包括将std :: pair适配为增强融合序列所需的模板。