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