The code below (adapted from the qi mini_xml example) does not compile. There is an error related to the brac rule, which has a recursive boost::variant attribute.
However, all commented versions of brac are compiled.
I am very curious to find out what makes a simple parser so special in this case:
#include <boost/config/warning_disable.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix_core.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/spirit/include/phoenix_fusion.hpp> #include <boost/spirit/include/phoenix_stl.hpp> #include <boost/spirit/include/phoenix_object.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/variant/recursive_variant.hpp> #include <string> #include <vector> namespace client { namespace fusion = boost::fusion; namespace phoenix = boost::phoenix; namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; struct ast_node; typedef boost::variant< boost::recursive_wrapper<ast_node>, std::string > ast_branch; struct ast_node { std::string text; std::vector<ast_branch> children; }; } BOOST_FUSION_ADAPT_STRUCT( client::ast_node, (std::string, text) (std::vector<client::ast_branch>, children) ) namespace client { template <typename Iterator> struct ast_node_grammar : qi::grammar<Iterator, ast_branch(), ascii::space_type> { ast_node_grammar() : ast_node_grammar::base_type(brac) { using qi::_1; using qi::_val; using ascii::char_; using ascii::string; name %= *char_; brac %= string("no way") ; // brac = string("works")[_val = _1] ; // brac %= string("this") | string("works"); // brac %= name ; // works // brac %= *char_ ; // works } qi::rule<Iterator, std::string()> name; qi::rule<Iterator, ast_branch(), ascii::space_type> brac; }; } int main(int argc, char **argv) { typedef client::ast_node_grammar<std::string::const_iterator> ast_node_grammar; ast_node_grammar gram; client::ast_branch ast; std::string text("dummy"); using boost::spirit::ascii::space; std::string::const_iterator iter = text.begin(); std::string::const_iterator end = text.end(); bool r = phrase_parse(iter, end, gram, space, ast); return r ? 0 : 1; }
Part of the error message:
/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:38:17: error: No match for 'boost::variant< boost::recursive_wrapper<client::ast_node>, basic_string<char> >::variant( const __normal_iterator<const char *, basic_string<char> > &, const __normal_iterator< const char *, basic_string<char> > &)'
Thanks in advance.
source share