// // Copyright (c) 2006 Joao Abecasis // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // //////////////////////////////////////////////////////////////////////////////// // // As reported by Jascha Wetzel, in // http://article.gmane.org/gmane.comp.parsers.spirit.general/9013, the // directives gen_ast_node_d and gen_pt_node_d were not working for lack of // appropriate conversion constructors in the underlying tree match policies. // //////////////////////////////////////////////////////////////////////////////// #include #include #include using namespace BOOST_SPIRIT_CLASSIC_NS; struct my_grammar : grammar { template struct definition { typedef scanner< typename Scanner::iterator_t, scanner_policies< typename Scanner::iteration_policy_t, ast_match_policy< typename Scanner::match_policy_t::iterator_t, typename Scanner::match_policy_t::factory_t >, typename Scanner::action_policy_t > > ast_scanner; typedef scanner< typename Scanner::iterator_t, scanner_policies< typename Scanner::iteration_policy_t, pt_match_policy< typename Scanner::match_policy_t::iterator_t, typename Scanner::match_policy_t::factory_t >, typename Scanner::action_policy_t > > pt_scanner; typedef rule ast_rule; typedef rule pt_rule; typedef rule rule_; definition(my_grammar const & /* self */) { start_ = gen_ast_node_d[ ast_rule_ ]; start_ = gen_pt_node_d[ pt_rule_ ]; } rule_ const & start() const { return start_; } rule_ start_; ast_rule ast_rule_; pt_rule pt_rule_; }; }; int main() { const char * begin = NULL, * end = NULL; pt_parse(begin, end, my_grammar()); ast_parse(begin, end, my_grammar()); }