//
//  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 <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_ast.hpp>
#include <boost/spirit/include/classic_parse_tree.hpp>

using namespace BOOST_SPIRIT_CLASSIC_NS;

struct my_grammar : grammar<my_grammar>
{
    template <class Scanner>
    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_scanner> ast_rule;
        typedef rule<pt_scanner> pt_rule;
        typedef rule<Scanner> 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, * end;

    pt_parse(begin, end, my_grammar());
    ast_parse(begin, end, my_grammar());
}
