Разбор Boost Spirit x3 в структуру с одним полем

Я продолжаю следить за примерами духов буста и столкнулся со следующей проблемой. (я думаю, что это было где-то описано как ошибка в коде, но я могу ошибаться)

Проще говоря: Parser не собирался при попытке синтаксического анализа в структуру с одним полем типа, унаследованного от x3 :: variant.

Вот часть кода

struct operand : x3::variant<
        nil
      , unsigned int
      , std::string          
      , x3::forward_ast<expression>
    >
{
    using base_type::base_type;
    using base_type::operator=;
};
struct assign_return
{
    char sign;
    operand var;
};

который я разбираю следующим образом (конечно, все, что ему нужно, правильно определить)

auto const areturn_def =
        lexeme["return" >> !(alnum | '_')] >> char_(':') >> expression >> ';';

Этот код работал правильно

но если я не хочу разбирать ':' и изменять все в соответствии с (конечно, я делаю изменения в BOOST_FUSION_ADAPT_STRUCT для этой структуры)

struct assign_return
{        
    operand var;
};
auto const areturn_def =
        lexeme["return" >> !(alnum | '_')] >> expression >> ';';

Этот код не создавал ошибку обмана:

C:\Program Files\boost\boost\boost\spirit\home\x3\nonterminal\rule.hpp:113:  undefined reference to `bool client::parser::parse_rule<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type>, client::ast::assign_return>(boost::spirit::x3::rule<client::parser::expression_class, client::ast::expression, false>, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type> const&, client::ast::assign_return&)'

Если мы внимательно посмотрим на код ошибки и включим в него упоминание

template <typename Iterator, typename Context, typename Attribute_>    
bool parse(Iterator& first, Iterator const& last
      , Context const& context, unused_type, Attribute_& attr) const

Мы могли видеть, что параметры шаблона верны, но список аргументов:

(rule, iterator, iterator, context, Attribute) 

Кажется, проблема с неопределенной ссылкой, но как?

Спасибо за любую помощь!


person Sergey Konoplev    schedule 08.08.2018    source источник
comment
Я обнаружил, что если я переключу последовательность полей в структуре struct assign_return { operand var; char sign; };, она выйдет из строя с ошибкой в ​​том же месте rule.hpp 113   -  person Sergey Konoplev    schedule 08.08.2018
comment
Не так давно я сделал некоторые исправления в Spirit, и ситуация с последовательностями одного размера улучшилась. Не могли бы вы приложить полный пример? (Я пробовал этот wandbox.org/permlink/pdu8jlGXZ5310L6R, и он компилируется, но обнаружил другую ошибку wandbox.org/permlink/MkI18CiOZ4vmSeVG, если значение атрибута установлено неправильно).   -  person Nikita Kniazev    schedule 17.08.2018


Ответы (1)