boost :: spirit :: karma: использование no_delimit с альтернативами

Я пытаюсь отключить разделение вокруг правила, которое включает оператор альтернатив (‘|’), но я получаю ошибку компиляции о несовместимых разделителях. В качестве примера я взял пример calc2_ast_dump.cpp из boost и изменил правило ast_node в struct dump_ast так:

ast_node %= no_delimit[int_ | binary_node | unary_node];

но это дает ошибку компиляции:

/usr/include/boost/function/function_template.hpp:754:17: note: candidate function not viable: no known conversion
from 'const
boost::spirit::karma::detail::unused_delimiter<boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii>
>' to 'const boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii>' for 3rd argument
result_type operator()(BOOST_FUNCTION_PARMS) const

и соответствующий комментарий в boost / spirit / home / karma / nonterminal / rule.hpp:

// If you are seeing a compilation error here stating that the
// third parameter can't be converted to a karma::reference
// then you are probably trying to use a rule or a grammar with
// an incompatible delimiter type.

в моем собственном проекте я могу сделать «no_delimit [ << b] «без проблем (используя разделитель кармы :: пробел).

Есть ли что-то, что мне не хватает альтернатив? почему no_delimit работать с ‘<<‘, но не’ | ‘?

Я использую Boost 1.48, так было ли исправление, которое мне нужно исправить?

1

Решение

Вам необходимо изменить объявления правил, чтобы они отражали тот факт, что они не используют разделитель.

Предполагая, что вы не хотите никакого разделения, вообще:

template <typename OuputIterator>
struct dump_ast
: karma::grammar<OuputIterator, expression_ast()>
{
dump_ast() : dump_ast::base_type(ast_node)
{
ast_node %= int_ | binary_node | unary_node;
binary_node %= '(' << ast_node << char_ << ast_node << ')';
unary_node %= '(' << char_ << ast_node << ')';
}

karma::rule<OuputIterator, expression_ast()> ast_node;
karma::rule<OuputIterator, binary_op()> binary_node;
karma::rule<OuputIterator, unary_op()> unary_node;
};

Смотрите это в прямом эфире http://liveworkspace.org/code/4edZlj$0

2

Другие решения

Других решений пока нет …