You need to modify the rule declarations to reflect the fact that they aren't using a delimiter.
Assuming that you didn't want any delimiting, whatsoever:
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;
};
See it live on http://liveworkspace.org/code/4edZlj$0