Я пытаюсь отключить разграничение вокруг правила, которое включает в себя оператор альтернатив ('|'), но я получаю ошибку компиляции о несовместимых разделителях. В качестве примера я взял пример calc2_ast_dump.cpp от повышения, и модифицировал правила ast_node в STRUCT dump_ast быть:boost :: spirit :: karma: using no_delimit с альтернативами
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
и соответствующий комментарий в импульс/дух/главная/карма/нетерминал/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 [а < < б]" без проблем (с использованием карма: разделитель пространства).
Есть ли что-то, что мне не хватает по поводу альтернатив? почему бы no_delimit работать с '< <', но не '|'?
Я использую boost 1.48, так было ли исправление, которое мне нужно подобрать?
ах, это было на самом деле это. Хотя, для уточнения моего проекта (не в моем сообщении), только все подрасы, используемые в no_delimit, должны быть написаны так, что они не используют разделитель. Правильно ли это понимание? – EHuhtala
Да, это в основном правильно. Вы можете добавить тип шкипера в качестве аргумента шаблона в генератор 'dump_ast' и по умолчанию использовать его' spirit :: unused_type', чтобы вы могли его переключать, не изменяя определения правил. – sehe