boost :: spirit :: karma:使用no_delimit替代

时间:2013-03-05 21:36:51

标签: c++ boost boost-spirit boost-variant boost-spirit-karma

我正在尝试关闭包含替代运算符('|')的规则的分隔,但是我收到了关于不兼容分隔符的编译错误。举个例子,我从boost获取了calc2_ast_dump.cpp示例,并将struct dump_ast中的ast_node规则修改为:

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 [a&lt;&lt; b]”(使用karma :: space delimiter)。

关于替代方案,我有什么遗漏吗?为什么no_delimit可以使用'&lt;&lt;'而不是'|'?

我正在使用boost 1.48,那么我需要拿起一个修正错误吗?

1 个答案:

答案 0 :(得分: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

上查看