spirit/classic/test/mix_and_match_trees.cpp

83 lines
2.4 KiB
C++

//
// 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 = NULL, * end = NULL;
pt_parse(begin, end, my_grammar());
ast_parse(begin, end, my_grammar());
}