Я пытаюсь отключить разделение вокруг правила, которое включает оператор альтернатив (‘|’), но я получаю ошибку компиляции о несовместимых разделителях. В качестве примера я взял пример 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, так было ли исправление, которое мне нужно исправить?
Вам необходимо изменить объявления правил, чтобы они отражали тот факт, что они не используют разделитель.
Предполагая, что вы не хотите никакого разделения, вообще:
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
Других решений пока нет …