4

Boost.Sprit x3を使用して、2 つの整数のシーケンスをstd::pair<int, int>. ドキュメントから判断すると、次のコードがコンパイルされるはずです。


#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>

int main()
{
    using namespace boost::spirit::x3;

    std::string input("1 2");
    std::pair<int, int> result;
    parse(input.begin(), input.end(), int_ >> int_, result);
}

melpon.org リンク


ただし、最初の整数にのみ一致します。に変更std::pair<int, int> result;int result;てから print すると、出力としてresult取得1されます。

なぜそれが起こっているのですか?2 つの整数int_ >> int_に一致する(そして属性として設定する)パーサーを定義する正しい方法ではありませんか?

4

1 に答える 1

5

実際、 @TC のインクルードのコメントは<boost/fusion/adapted/std_pair.hpp>コンパイラを沈黙させるだけで十分であり、文字列を正しく解析することはできません。また、空白をスキップするx3::parse()for aを変更する必要がありました。x3::phrase_parse()

#include <iostream>
#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/adapted/std_pair.hpp>

int main()
{
    namespace x3 = boost::spirit::x3;

    std::string input("1 2");
    std::pair<int, int> result;
    auto ok = x3::phrase_parse(input.begin(), input.end(), x3::int_ >> x3::int_, x3::space, result);
    std::cout << std::boolalpha << ok << ": ";
    std::cout << result.first << ", " << result.second;
}

実際の例

using namespace boost::spirit::x3your もnamespace aliasに置き換えたことに注意してくださいx3。これにより可読性は維持されますが、膨大な量の Boost.Spirit シンボルがコードにダンプされるのを防ぐことができます。

于 2016-08-07T18:15:53.570 に答える