parse_tree_utils.ipp
来自「CGAL is a collaborative effort of severa」· IPP 代码 · 共 132 行
IPP
132 行
/*============================================================================= Copyright (c) 2001-2003 Daniel Nuffer Copyright (c) 2001-2003 Hartmut Kaiser 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)=============================================================================*/#if !defined(PARSE_TREE_UTILS_IPP)#define PARSE_TREE_UTILS_IPP///////////////////////////////////////////////////////////////////////////////namespace boost {namespace spirit {/////////////////////////////////////////////////////////////////////////////////// Returnes the first leaf node of the given parsetree./////////////////////////////////////////////////////////////////////////////////template <typename T>inline tree_node<T> const &get_first_leaf (tree_node<T> const &node){ if (node.children.size() > 0) return get_first_leaf(*node.children.begin()); return node;}/////////////////////////////////////////////////////////////////////////////////// Find a specified node through recursive search./////////////////////////////////////////////////////////////////////////////////template <typename T>inline boolfind_node (tree_node<T> const &node, parser_id node_to_search, tree_node<T> const **found_node){ if (node.value.id() == node_to_search) { *found_node = &node; return true; } if (node.children.size() > 0) { typedef typename tree_node<T>::const_tree_iterator const_tree_iterator; const_tree_iterator end = node.children.end(); for (const_tree_iterator it = node.children.begin(); it != end; ++it) { if (find_node (*it, node_to_search, found_node)) return true; } } return false; // not found here}/////////////////////////////////////////////////////////////////////////////////// The functions 'get_node_range' return a pair of iterators pointing at the// range, which containes the elements of a specified node./////////////////////////////////////////////////////////////////////////////////namespace impl {template <typename T>inline boolget_node_range (typename tree_node<T>::const_tree_iterator const &start, parser_id node_to_search, std::pair<typename tree_node<T>::const_tree_iterator, typename tree_node<T>::const_tree_iterator> &nodes){// look at this node firsttree_node<T> const &node = *start; if (node.value.id() == node_to_search) { if (node.children.size() > 0) { // full subrange nodes.first = node.children.begin(); nodes.second = node.children.end(); } else { // only this node nodes.first = start; nodes.second = start; std::advance(nodes.second, 1); } return true; }// look at subnodes now if (node.children.size() > 0) { typedef typename tree_node<T>::const_tree_iterator const_tree_iterator; const_tree_iterator end = node.children.end(); for (const_tree_iterator it = node.children.begin(); it != end; ++it) { if (impl::get_node_range<T>(it, node_to_search, nodes)) return true; } } return false;}} // end of namespace impltemplate <typename T>inline boolget_node_range (tree_node<T> const &node, parser_id node_to_search, std::pair<typename tree_node<T>::const_tree_iterator, typename tree_node<T>::const_tree_iterator> &nodes){ if (node.children.size() > 0) { typedef typename tree_node<T>::const_tree_iterator const_tree_iterator; const_tree_iterator end = node.children.end(); for (const_tree_iterator it = node.children.begin(); it != end; ++it) { if (impl::get_node_range<T>(it, node_to_search, nodes)) return true; } } return false;}///////////////////////////////////////////////////////////////////////////////} // namespace spirit} // namespace boost#endif // !defined(PARSE_TREE_UTILS_IPP)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?