1 /*=============================================================================
2 Copyright (c) 2001-2003 Joel de Guzman
3 Copyright (c) 2002-2003 Hartmut Kaiser
4 http://spirit.sourceforge.net/
6 Use, modification and distribution is subject to the Boost Software
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10 #if !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)
11 #define BOOST_SPIRIT_PARSER_NAMES_IPP
13 #if defined(BOOST_SPIRIT_DEBUG)
19 #include <boost/config.hpp>
20 #ifdef BOOST_NO_STRINGSTREAM
22 #define BOOST_SPIRIT_SSTREAM std::strstream
23 std::string BOOST_SPIRIT_GETSTRING(std::strstream& ss)
26 std::string rval = ss.str();
32 #define BOOST_SPIRIT_GETSTRING(ss) ss.str()
33 #define BOOST_SPIRIT_SSTREAM std::stringstream
36 namespace boost { namespace spirit {
38 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
40 ///////////////////////////////////////////////////////////////////////////////
42 template <typename ParserT, typename ActionT>
44 parser_name(action<ParserT, ActionT> const& p)
46 return std::string("action")
48 + parser_name(p.subject())
52 ///////////////////////////////////////////////////////////////////////////////
53 // from directives.hpp
54 template <typename ParserT>
56 parser_name(contiguous<ParserT> const& p)
58 return std::string("contiguous")
60 + parser_name(p.subject())
64 template <typename ParserT>
66 parser_name(inhibit_case<ParserT> const& p)
68 return std::string("inhibit_case")
70 + parser_name(p.subject())
74 template <typename A, typename B>
76 parser_name(longest_alternative<A, B> const& p)
78 return std::string("longest_alternative")
80 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
84 template <typename A, typename B>
86 parser_name(shortest_alternative<A, B> const& p)
88 return std::string("shortest_alternative")
90 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
94 ///////////////////////////////////////////////////////////////////////////////
96 template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
98 parser_name(uint_parser<T, Radix, MinDigits, MaxDigits> const& p)
100 BOOST_SPIRIT_SSTREAM stream;
101 stream << Radix << ", " << MinDigits << ", " << MaxDigits;
102 return std::string("uint_parser<")
103 + BOOST_SPIRIT_GETSTRING(stream)
107 template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
109 parser_name(int_parser<T, Radix, MinDigits, MaxDigits> const& p)
111 BOOST_SPIRIT_SSTREAM stream;
112 stream << Radix << ", " << MinDigits << ", " << MaxDigits;
113 return std::string("int_parser<")
114 + BOOST_SPIRIT_GETSTRING(stream)
118 template <typename T, typename RealPoliciesT>
120 parser_name(real_parser<T, RealPoliciesT> const& p)
122 return std::string("real_parser");
125 ///////////////////////////////////////////////////////////////////////////////
126 // from operators.hpp
127 template <typename A, typename B>
129 parser_name(sequence<A, B> const& p)
131 return std::string("sequence")
133 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
137 template <typename A, typename B>
139 parser_name(sequential_or<A, B> const& p)
141 return std::string("sequential_or")
143 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
147 template <typename A, typename B>
149 parser_name(alternative<A, B> const& p)
151 return std::string("alternative")
153 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
157 template <typename A, typename B>
159 parser_name(intersection<A, B> const& p)
161 return std::string("intersection")
163 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
167 template <typename A, typename B>
169 parser_name(difference<A, B> const& p)
171 return std::string("difference")
173 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
177 template <typename A, typename B>
179 parser_name(exclusive_or<A, B> const& p)
181 return std::string("exclusive_or")
183 + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
187 template <typename S>
189 parser_name(optional<S> const& p)
191 return std::string("optional")
193 + parser_name(p.subject())
197 template <typename S>
199 parser_name(kleene_star<S> const& p)
201 return std::string("kleene_star")
203 + parser_name(p.subject())
207 template <typename S>
209 parser_name(positive<S> const& p)
211 return std::string("positive")
213 + parser_name(p.subject())
217 ///////////////////////////////////////////////////////////////////////////////
219 template <typename DerivedT>
221 parser_name(parser<DerivedT> const& p)
223 return std::string("parser");
226 ///////////////////////////////////////////////////////////////////////////////
227 // from primitives.hpp
228 template <typename DerivedT>
230 parser_name(char_parser<DerivedT> const &p)
232 return std::string("char_parser");
235 template <typename CharT>
237 parser_name(chlit<CharT> const &p)
239 return std::string("chlit(\'")
240 + std::string(1, p.ch)
241 + std::string("\')");
244 template <typename CharT>
246 parser_name(range<CharT> const &p)
248 return std::string("range(")
249 + std::string(1, p.first) + std::string(", ") + std::string(1, p.last)
253 template <typename IteratorT>
255 parser_name(chseq<IteratorT> const &p)
257 return std::string("chseq(\"")
258 + std::string(p.first, p.last)
259 + std::string("\")");
262 template <typename IteratorT>
264 parser_name(strlit<IteratorT> const &p)
266 return std::string("strlit(\"")
267 + std::string(p.seq.first, p.seq.last)
268 + std::string("\")");
272 parser_name(nothing_parser const&)
274 return std::string("nothing");
278 parser_name(epsilon_parser const&)
280 return std::string("epsilon");
284 parser_name(anychar_parser const&)
286 return std::string("anychar");
290 parser_name(alnum_parser const&)
292 return std::string("alnum");
296 parser_name(alpha_parser const&)
298 return std::string("alpha");
302 parser_name(cntrl_parser const&)
304 return std::string("cntrl");
308 parser_name(digit_parser const&)
310 return std::string("digit");
314 parser_name(graph_parser const&)
316 return std::string("graph");
320 parser_name(lower_parser const&)
322 return std::string("lower");
326 parser_name(print_parser const&)
328 return std::string("print");
332 parser_name(punct_parser const&)
334 return std::string("punct");
338 parser_name(blank_parser const&)
340 return std::string("blank");
344 parser_name(space_parser const&)
346 return std::string("space");
350 parser_name(upper_parser const&)
352 return std::string("upper");
356 parser_name(xdigit_parser const&)
358 return std::string("xdigit");
362 parser_name(eol_parser const&)
364 return std::string("eol");
368 parser_name(end_parser const&)
370 return std::string("end");
373 ///////////////////////////////////////////////////////////////////////////////
378 typedef std::pair<std::string, bool> rule_info;
379 typedef std::map<void const *, rule_info> rule_infos;
381 std::string find_node(void const *r)
383 rule_infos::const_iterator cit = infos.find(r);
384 if (cit != infos.end())
385 return (*cit).second.first;
386 return std::string("<unknown>");
389 bool trace_node(void const *r)
391 rule_infos::const_iterator cit = infos.find(r);
392 if (cit != infos.end())
393 return (*cit).second.second;
394 return BOOST_SPIRIT_DEBUG_TRACENODE;
397 bool register_node(void const *r, char const *name_to_register,
400 if (infos.find(r) != infos.end())
403 return infos.insert(rule_infos::value_type(r,
404 rule_info(std::string(name_to_register), trace_node))
408 bool unregister_node(void const *r)
410 if (infos.find(r) == infos.end())
412 return (1 == infos.erase(r));
419 inline node_registry &
422 static node_registry node_infos;
428 typename DerivedT, typename EmbedT,
429 typename T0, typename T1, typename T2
432 parser_name(impl::rule_base<DerivedT, EmbedT, T0, T1, T2> const& p)
434 return std::string("rule_base")
436 + impl::get_node_registry().find_node(&p)
440 template<typename T0, typename T1, typename T2>
442 parser_name(rule<T0, T1, T2> const& p)
444 return std::string("rule")
446 + impl::get_node_registry().find_node(&p)
450 ///////////////////////////////////////////////////////////////////////////////
452 template <typename FirstT, typename RestT>
454 parser_name(subrule_list<FirstT, RestT> const &p)
456 return std::string("subrule_list")
458 + impl::get_node_registry().find_node(&p)
462 template <int ID, typename DefT, typename ContextT>
464 parser_name(subrule_parser<ID, DefT, ContextT> const &p)
466 return std::string("subrule_parser")
468 + impl::get_node_registry().find_node(&p)
472 template <int ID, typename ContextT>
474 parser_name(subrule<ID, ContextT> const &p)
476 BOOST_SPIRIT_SSTREAM stream;
478 return std::string("subrule<")
479 + BOOST_SPIRIT_GETSTRING(stream)
481 + impl::get_node_registry().find_node(&p)
485 ///////////////////////////////////////////////////////////////////////////////
487 template <typename DerivedT, typename ContextT>
489 parser_name(grammar<DerivedT, ContextT> const& p)
491 return std::string("grammar")
493 + impl::get_node_registry().find_node(&p)
497 ///////////////////////////////////////////////////////////////////////////////
498 // decide, if a node is to be traced or not
500 typename DerivedT, typename EmbedT,
501 typename T0, typename T1, typename T2
504 trace_parser(impl::rule_base<DerivedT, EmbedT, T0, T1, T2>
507 return impl::get_node_registry().trace_node(&p);
510 template<typename T0, typename T1, typename T2>
512 trace_parser(rule<T0, T1, T2> const& p)
514 return impl::get_node_registry().trace_node(&p);
517 template <typename DerivedT, typename ContextT>
519 trace_parser(grammar<DerivedT, ContextT> const& p)
521 return impl::get_node_registry().trace_node(&p);
524 template <typename DerivedT, int N, typename ContextT>
526 trace_parser(impl::entry_grammar<DerivedT, N, ContextT> const& p)
528 return impl::get_node_registry().trace_node(&p);
531 template <int ID, typename ContextT>
533 trace_parser(subrule<ID, ContextT> const& p)
535 return impl::get_node_registry().trace_node(&p);
538 template <typename ParserT, typename ActorTupleT>
540 trace_parser(init_closure_parser<ParserT, ActorTupleT> const& p)
542 return impl::get_node_registry().trace_node(&p);
545 ///////////////////////////////////////////////////////////////////////////////
546 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
548 }} // namespace boost::spirit
550 #undef BOOST_SPIRIT_SSTREAM
551 #undef BOOST_SPIRIT_GETSTRING
553 #endif // defined(BOOST_SPIRIT_DEBUG)
555 #endif // !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)