2013-03-05 3 views
1

Я пытаюсь отключить разграничение вокруг правила, которое включает в себя оператор альтернатив ('|'), но я получаю ошибку компиляции о несовместимых разделителях. В качестве примера я взял пример 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, так было ли исправление, которое мне нужно подобрать?

ответ

2

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

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

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

+0

ах, это было на самом деле это. Хотя, для уточнения моего проекта (не в моем сообщении), только все подрасы, используемые в no_delimit, должны быть написаны так, что они не используют разделитель. Правильно ли это понимание? – EHuhtala

+0

Да, это в основном правильно. Вы можете добавить тип шкипера в качестве аргумента шаблона в генератор 'dump_ast' и по умолчанию использовать его' spirit :: unused_type', чтобы вы могли его переключать, не изменяя определения правил. – sehe

Смежные вопросы