parse_tree.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 266 行

HPP
266
字号
/*=============================================================================    Copyright (c) 2001-2003 Daniel Nuffer    http://spirit.sourceforge.net/    Use, modification and distribution is subject to 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)=============================================================================*/#ifndef BOOST_SPIRIT_TREE_PARSE_TREE_HPP#define BOOST_SPIRIT_TREE_PARSE_TREE_HPP#include <boost/spirit/tree/common.hpp>#include <boost/spirit/core/scanner/scanner.hpp>///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit {template <typename MatchPolicyT, typename NodeFactoryT>struct pt_tree_policy;//////////////////////////////////// pt_match_policy is simply an id so the correct specialization of tree_policy can be found.template <    typename IteratorT,    typename NodeFactoryT = node_val_data_factory<nil_t>>struct pt_match_policy :    public common_tree_match_policy<        pt_match_policy<IteratorT, NodeFactoryT>,        IteratorT,        NodeFactoryT,        pt_tree_policy<            pt_match_policy<IteratorT, NodeFactoryT>,            NodeFactoryT        >    >{};//////////////////////////////////template <typename MatchPolicyT, typename NodeFactoryT>struct pt_tree_policy :    public common_tree_tree_policy<MatchPolicyT, NodeFactoryT>{    typedef        typename common_tree_tree_policy<MatchPolicyT, NodeFactoryT>::match_t        match_t;    typedef typename MatchPolicyT::iterator_t iterator_t;    static void concat(match_t& a, match_t const& b)    {        typedef typename match_t::attr_t attr_t;        BOOST_SPIRIT_ASSERT(a && b);        std::copy(b.trees.begin(), b.trees.end(),            std::back_insert_iterator<typename match_t::container_t>(a.trees));    }    template <typename Iterator1T, typename Iterator2T>    static void group_match(match_t& m, parser_id const& id,            Iterator1T const& first, Iterator2T const& last)    {        if (!m)            return;        typedef typename NodeFactoryT::template factory<iterator_t> factory_t;        typedef typename tree_match<iterator_t, NodeFactoryT>::container_t            container_t;        typedef typename container_t::iterator cont_iterator_t;        match_t newmatch(m.length(),                factory_t::create_node(first, last, false));        std::swap(newmatch.trees.begin()->children, m.trees);        // set this node and all it's unset children's rule_id        newmatch.trees.begin()->value.id(id);        for (cont_iterator_t i = newmatch.trees.begin()->children.begin();                i != newmatch.trees.begin()->children.end();                ++i)        {            if (i->value.id() == 0)                i->value.id(id);        }        m = newmatch;    }    template <typename FunctorT>    static void apply_op_to_match(FunctorT const& op, match_t& m)    {        op(m);    }};namespace impl {    template <typename IteratorT, typename NodeFactoryT>    struct tree_policy_selector<pt_match_policy<IteratorT, NodeFactoryT> >    {        typedef pt_tree_policy<            pt_match_policy<IteratorT, NodeFactoryT>, NodeFactoryT> type;    };} // namespace impl//////////////////////////////////struct gen_pt_node_parser_gen;template <typename T>struct gen_pt_node_parser:   public unary<T, parser<gen_pt_node_parser<T> > >{    typedef gen_pt_node_parser<T> self_t;    typedef gen_pt_node_parser_gen parser_generator_t;    typedef unary_parser_category parser_category_t;//    typedef gen_pt_node_parser<T> const &embed_t;    gen_pt_node_parser(T const& a)    : unary<T, parser<gen_pt_node_parser<T> > >(a) {}    template <typename ScannerT>    typename parser_result<self_t, ScannerT>::type    parse(ScannerT const& scan) const    {        typedef typename ScannerT::iteration_policy_t iteration_policy_t;        typedef typename ScannerT::match_policy_t::iterator_t iterator_t;        typedef typename ScannerT::match_policy_t::factory_t factory_t;        typedef pt_match_policy<iterator_t, factory_t> match_policy_t;        typedef typename ScannerT::action_policy_t action_policy_t;        typedef scanner_policies<            iteration_policy_t,            match_policy_t,            action_policy_t        > policies_t;        return this->subject().parse(scan.change_policies(policies_t(scan)));    }};//////////////////////////////////struct gen_pt_node_parser_gen{    template <typename T>    struct result {        typedef gen_pt_node_parser<T> type;    };    template <typename T>    static gen_pt_node_parser<T>    generate(parser<T> const& s)    {        return gen_pt_node_parser<T>(s.derived());    }    template <typename T>    gen_pt_node_parser<T>    operator[](parser<T> const& s) const    {        return gen_pt_node_parser<T>(s.derived());    }};//////////////////////////////////const gen_pt_node_parser_gen gen_pt_node_d = gen_pt_node_parser_gen();///////////////////////////////////////////////////////////////////////////////////  Parse functions for parse trees/////////////////////////////////////////////////////////////////////////////////template <    typename NodeFactoryT, typename IteratorT, typename ParserT,     typename SkipT>inline tree_parse_info<IteratorT, NodeFactoryT>pt_parse(    IteratorT const&        first_,    IteratorT const&        last,    parser<ParserT> const&  p,    SkipT const&            skip,    NodeFactoryT const &    /*dummy_*/ = NodeFactoryT()){    typedef skip_parser_iteration_policy<SkipT> iter_policy_t;    typedef pt_match_policy<IteratorT, NodeFactoryT> pt_match_policy_t;    typedef        scanner_policies<iter_policy_t, pt_match_policy_t>        scanner_policies_t;    typedef scanner<IteratorT, scanner_policies_t> scanner_t;    iter_policy_t iter_policy(skip);    scanner_policies_t policies(iter_policy);    IteratorT first = first_;    scanner_t scan(first, last, policies);    tree_match<IteratorT, NodeFactoryT> hit = p.derived().parse(scan);    scan.skip(scan);    return tree_parse_info<IteratorT, NodeFactoryT>(        first, hit, hit && (first == last), hit.length(), hit.trees);}template <typename IteratorT, typename ParserT, typename SkipT>inline tree_parse_info<IteratorT>pt_parse(    IteratorT const&        first,    IteratorT const&        last,    parser<ParserT> const&  p,    SkipT const&            skip){    typedef node_val_data_factory<nil_t> default_node_factory_t;    return pt_parse(first, last, p, skip, default_node_factory_t());}//////////////////////////////////template <typename IteratorT, typename ParserT>inline tree_parse_info<IteratorT>pt_parse(    IteratorT const&        first_,    IteratorT const&        last,    parser<ParserT> const&  parser){    IteratorT first = first_;    scanner<        IteratorT,        scanner_policies<iteration_policy, pt_match_policy<IteratorT> >    > scan(first, last);    tree_match<IteratorT> hit = parser.derived().parse(scan);    return tree_parse_info<IteratorT>(first, hit, hit && (first == last),        hit.length(), hit.trees);}//////////////////////////////////template <typename CharT, typename ParserT, typename SkipT>inline tree_parse_info<CharT const*>pt_parse(    CharT const*            str,    parser<ParserT> const&  p,    SkipT const&            skip){    CharT const* last = str;    while (*last)        last++;    return pt_parse(str, last, p, skip);}//////////////////////////////////template <typename CharT, typename ParserT>inline tree_parse_info<CharT const*>pt_parse(    CharT const*            str,    parser<ParserT> const&  parser){    CharT const* last = str;    while (*last)    {        last++;    }    return pt_parse(str, last, parser);}///////////////////////////////////////////////////////////////////////////////}} // namespace boost::spirit#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?