Член кортежа Boost Spirit x3 в структуре, адаптированной к фьюжн - PullRequest
1 голос
/ 27 октября 2019

Следующий тестовый пример - сокращение большого многофайлового парсера, отсюда и несколько странный порядок объявлений и определений. Он не компилируется, и я понимаю, что std::tuple отключает его. Из документации мне кажется, что в синтезированном атрибуте должен присутствовать std :: tuple, если присутствуют правильные включения. Что я делаю не так?

// -*- mode: c++; -*-

#include <iostream>
#include <tuple>

#include <boost/fusion/include/io.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/std_tuple.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>

#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;

#include <boost/spirit/include/support_istream_iterator.hpp>

namespace ast {

struct S {
    std::tuple< int, int > t;
    int i;
};

using boost::fusion::operator<<;

} // namespace ast

BOOST_FUSION_ADAPT_STRUCT (ast::S, t, i)

namespace parser {

using S_type = x3::rule< struct S_class, ast::S >;
BOOST_SPIRIT_DECLARE(S_type)

struct S_class;
const S_type S = "S";

using x3::int_;
const auto S_def = ( int_ >> int_ ) >> int_;

BOOST_SPIRIT_DEFINE(S)

struct S_class { };

} // namespace parser

template< typename Iterator >
bool parse (Iterator& iter, Iterator last, ast::S& s) {
    using x3::ascii::space;

#if 1
    return x3::phrase_parse (iter, last, parser::S, space, s);
#else
    return x3::parse (iter, last, ( x3::int_ >> x3::int_ ) >> x3::int_, s);
#endif // 0
}

int main () {
    const std::string s = "1 2 3";
    auto iter = s.begin ();

    ast::S obj;
    return !parse (iter, s.end (), obj);
}

Спасибо большое.

1 Ответ

1 голос
/ 28 октября 2019

Это вложенная структура. Однако вы разбираете в плоский синтезированный кортеж, который не соответствует структуре AST:

Другими словами ((int, int), int) структурно не совместим с (int, (int, int)) или даже (int, int, int), как ваше правило будет анализировать.

Упомянутые обходные пути помогают при приведении атрибутов отражать желаемую (и требуемую) структуру.

...