1 /*============================================================================= 2 Copyright (c) 2001-2007 Hartmut Kaiser 3 Copyright (c) 2001-2003 Daniel Nuffer 4 http://spirit.sourceforge.net/ 5 6 Distributed under the Boost Software License, Version 1.0. (See accompanying 7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 =============================================================================*/ 9 10 #ifndef BOOST_SPIRIT_CLASSIC_TREE_TREE_TO_XML_HPP 11 #define BOOST_SPIRIT_CLASSIC_TREE_TREE_TO_XML_HPP 12 13 #include <boost/spirit/home/classic/namespace.hpp> 14 15 namespace boost { namespace spirit { 16 17 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN 18 19 namespace impl { 20 template <typename CharT> struct default_string; 21 } 22 23 /////////////////////////////////////////////////////////////////////////////// 24 // 25 // Dump a parse tree as a xml stream 26 // 27 // The functions 'tree_to_xml' can be used to output a parse tree as a xml 28 // stream into the given ostream. The parameters have the following 29 // meaning: 30 // 31 // mandatory parameters: 32 // ostrm The output stream used for streaming the parse tree. 33 // tree The parse tree to output. 34 // 35 // optional parameters: 36 // input_line The input line from which the parse tree was 37 // generated (if given, it is used to output a comment 38 // containing this line). 39 // id_to_name A map, which is used for converting the rule id's contained 40 // in the parse tree to readable strings. Here a auxiliary 41 // associative container can be used, which maps a rule_id to 42 // a std::string (i.e. a std::map<rule_id, std::string>). 43 // get_token_id 44 // A function or functor, which takes an instance of a token 45 // and which should return a token id (i.e. something like 46 // 'int f(char const c)'). 47 // get_token_value 48 // A function or functor, which takes an instance of a token 49 // and which should return a readable representation of this 50 // token (i.e. something like 'std::string f(char const c)'). 51 // 52 // The structure of the generated xml stream conforms to the DTD given in the 53 // file 'parsetree.dtd'. This file is located in the spirit/tree directory. 54 // 55 /////////////////////////////////////////////////////////////////////////////// 56 57 template < 58 typename CharT, typename TreeNodeT, typename AssocContainerT, 59 typename GetIdT, typename GetValueT 60 > 61 inline void 62 basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree, 63 std::basic_string<CharT> const &input_line, 64 AssocContainerT const& id_to_name, GetIdT const &get_token_id, 65 GetValueT const &get_token_value); 66 67 template <typename CharT, typename TreeNodeT, typename AssocContainerT> 68 inline void 69 basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree, 70 std::basic_string<CharT> const &input_line, 71 AssocContainerT const& id_to_name); 72 73 template <typename CharT, typename TreeNodeT> 74 inline void 75 basic_tree_to_xml (std::basic_ostream<CharT> &ostrm, TreeNodeT const &tree, 76 std::basic_string<CharT> const &input_line = 77 impl::default_string<CharT>::get()); 78 79 /////////////////////////////////////////////////////////////////////////// 80 template < 81 typename TreeNodeT, typename AssocContainerT, 82 typename GetIdT, typename GetValueT 83 > 84 inline void tree_to_xml(std::ostream & ostrm,TreeNodeT const & tree,std::string const & input_line,AssocContainerT const & id_to_name,GetIdT const & get_token_id,GetValueT const & get_token_value)85 tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree, 86 std::string const &input_line, AssocContainerT const& id_to_name, 87 GetIdT const &get_token_id, GetValueT const &get_token_value) 88 { 89 basic_tree_to_xml<char>(ostrm, tree, input_line, id_to_name, 90 get_token_id, get_token_value); 91 } 92 93 template <typename TreeNodeT, typename AssocContainerT> 94 inline void tree_to_xml(std::ostream & ostrm,TreeNodeT const & tree,std::string const & input_line,AssocContainerT const & id_to_name)95 tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree, 96 std::string const &input_line, AssocContainerT const& id_to_name) 97 { 98 basic_tree_to_xml<char>(ostrm, tree, input_line, id_to_name); 99 } 100 101 template <typename TreeNodeT> 102 inline void tree_to_xml(std::ostream & ostrm,TreeNodeT const & tree,std::string const & input_line="")103 tree_to_xml (std::ostream &ostrm, TreeNodeT const &tree, 104 std::string const &input_line = "") 105 { 106 basic_tree_to_xml<char>(ostrm, tree, input_line); 107 } 108 109 BOOST_SPIRIT_CLASSIC_NAMESPACE_END 110 111 }} // namespace BOOST_SPIRIT_CLASSIC_NS 112 113 #include <boost/spirit/home/classic/tree/impl/tree_to_xml.ipp> 114 115 #endif 116 117