Вопросы по тегу: abstract-syntax-tree

(1)

Атрибуты из грамматики Boost.Spirit: ошибка из std: vector of boost :: variant

Получил рабочий парсер для чтения описания позиций для настольной игры (международные шашки, официальная грамматика):#include #include namespace x3 = boost::spirit::x3; auto const colon = x3::lit(':'); auto const comma = x3::lit(','); auto const dash = x3::lit('-'); auto const dot = x3::lit('.'); auto const king = x3::char_('K'); auto const color = x3::char_("BW"); auto const num_sq = x3::int_; auto const num_pc = -king >> num_sq; // Kxx means king on square xx, xx a man on that square auto const num_rng = num_pc >> dash >> num_sq; // xx-yy means range of squares xx through yy (inclusive) auto const num_seq = (num_rng | num_pc) % comma; // auto const ccn = colon >> color >> -num_seq; auto const num_not = x3::repeat(2)[ccn]; // need to specify both white and black pieces auto const fen = color >> num_not >> -dot; Live On Coliru Теперь я хочу извлечь значения из синтезированных атрибутов, поэтому я сделал шаблонный танец вокруг Boost.Fusion и т. Д., namespace ast { struct num_pc { boost::optional k; int sq; }; struct num_rng { boost::optional k; int first, last; }; using rng_or_pc = boost::variant; struct num_seq { std::vector sqrs; }; struct ccn { char c; boost::optional seq; }; struct num_not { std::vector n; }; struct fen { char c; num_not n; }; } // namespace ast BOOST_FUSION_ADAPT_STRUCT(ast::num_pc, (boost::optional, k), (int, sq)) BOOST_FUSION_ADAPT_STRUCT(ast::num_rng, (boost::optional, k), (int, first), (int, last)) BOOST_FUSION_ADAPT_STRUCT(ast::num_seq, (std::vector, sqrs)) BOOST_FUSION_ADAPT_STRUCT(ast::ccn, (char, c), (boost::optional, seq)) BOOST_FUSION_ADAPT_STRUCT(ast::num_not, (std::vector, n)) BOOST_FUSION_ADAPT_STRUCT(ast::fen, (char, c), (ast::num_not, n)) x3::rule num_pc = "num_pc"; x3::rule num_rng = "num_rng"; x3::rule num_seq = "num_seq"; x3::rule ccn = "ccn"; x3::rule num_not = "num_not"; x3::rule fen = "fen"; auto const colon = x3::lit(':'); auto const comma = x3::lit(','); auto const dash = x3::lit('-'); auto const dot = x3::lit('.'); auto const king = x3::char_('K'); auto const color = x3::char_("BW"); auto const num_sq = x3::int_; auto const num_pc_def = -king >> num_sq; auto const num_rng_def = num_pc >> dash >> num_sq; auto const num_seq_def = (num_rng | num_pc) % comma; auto const ccn_def = colon >> color >> -num_seq; auto const num_not_def = x3::repeat(2)[ccn]; auto const fen_def = color >> num_not >> -dot; BOOST_SPIRIT_DEFINE(num_pc, num_rng, num_seq, ccn, num_not, fen) Live On Coliru Однако затем я получаю сообщение об ошибке: ошибка: static_assert failed "Атрибут не имеет ожидаемого значения. размер. " и на пару страниц вниз: ^ main.cpp: 16: 8: note: конструктор-кандидат (конструктор неявного перемещения) нежизнеспособен: нет известного преобразования из 'std :: vector , std :: allocator >>'для 'ast :: num_seq' для первого аргумента struct num_seq { std :: vector sqrs; }; ^ main.cpp: 16: 8: note: конструктор-кандидат (конструктор неявного копирования) не жизнеспособен: нет известного преобразования из 'std :: vector , std :: allocator >>'для 'const ast :: num_seq' для первого аргумента struct num_seq { std :: vector sqrs; }; Вопрос: откуда эта ошибка и как ее исправить? По-видимому, синтезированный атрибут моего правила num_seq не равен std :: vector >. Как это исправить?
T

TemplateRex

6 лет назад

Ответов: 1

2022 WebDevInsider