parser_names.ipp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. /*=============================================================================
  2. Copyright (c) 2001-2003 Joel de Guzman
  3. Copyright (c) 2002-2003 Hartmut Kaiser
  4. http://spirit.sourceforge.net/
  5. Use, modification and distribution is subject to the Boost Software
  6. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. http://www.boost.org/LICENSE_1_0.txt)
  8. =============================================================================*/
  9. #if !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)
  10. #define BOOST_SPIRIT_PARSER_NAMES_IPP
  11. #if defined(BOOST_SPIRIT_DEBUG)
  12. #include <string>
  13. #include <iostream>
  14. #include <map>
  15. #include <boost/config.hpp>
  16. #ifdef BOOST_NO_STRINGSTREAM
  17. #include <strstream>
  18. #define BOOST_SPIRIT_SSTREAM std::strstream
  19. std::string BOOST_SPIRIT_GETSTRING(std::strstream& ss)
  20. {
  21. ss << ends;
  22. std::string rval = ss.str();
  23. ss.freeze(false);
  24. return rval;
  25. }
  26. #else
  27. #include <sstream>
  28. #define BOOST_SPIRIT_GETSTRING(ss) ss.str()
  29. #define BOOST_SPIRIT_SSTREAM std::stringstream
  30. #endif
  31. namespace boost { namespace spirit {
  32. BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
  33. ///////////////////////////////////////////////////////////////////////////////
  34. // from actions.hpp
  35. template <typename ParserT, typename ActionT>
  36. inline std::string
  37. parser_name(action<ParserT, ActionT> const& p)
  38. {
  39. return std::string("action")
  40. + std::string("[")
  41. + parser_name(p.subject())
  42. + std::string("]");
  43. }
  44. ///////////////////////////////////////////////////////////////////////////////
  45. // from directives.hpp
  46. template <typename ParserT>
  47. inline std::string
  48. parser_name(contiguous<ParserT> const& p)
  49. {
  50. return std::string("contiguous")
  51. + std::string("[")
  52. + parser_name(p.subject())
  53. + std::string("]");
  54. }
  55. template <typename ParserT>
  56. inline std::string
  57. parser_name(inhibit_case<ParserT> const& p)
  58. {
  59. return std::string("inhibit_case")
  60. + std::string("[")
  61. + parser_name(p.subject())
  62. + std::string("]");
  63. }
  64. template <typename A, typename B>
  65. inline std::string
  66. parser_name(longest_alternative<A, B> const& p)
  67. {
  68. return std::string("longest_alternative")
  69. + std::string("[")
  70. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  71. + std::string("]");
  72. }
  73. template <typename A, typename B>
  74. inline std::string
  75. parser_name(shortest_alternative<A, B> const& p)
  76. {
  77. return std::string("shortest_alternative")
  78. + std::string("[")
  79. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  80. + std::string("]");
  81. }
  82. ///////////////////////////////////////////////////////////////////////////////
  83. // from numerics.hpp
  84. template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
  85. inline std::string
  86. parser_name(uint_parser<T, Radix, MinDigits, MaxDigits> const& /*p*/)
  87. {
  88. BOOST_SPIRIT_SSTREAM stream;
  89. stream << Radix << ", " << MinDigits << ", " << MaxDigits;
  90. return std::string("uint_parser<")
  91. + BOOST_SPIRIT_GETSTRING(stream)
  92. + std::string(">");
  93. }
  94. template <typename T, int Radix, unsigned MinDigits, int MaxDigits>
  95. inline std::string
  96. parser_name(int_parser<T, Radix, MinDigits, MaxDigits> const& /*p*/)
  97. {
  98. BOOST_SPIRIT_SSTREAM stream;
  99. stream << Radix << ", " << MinDigits << ", " << MaxDigits;
  100. return std::string("int_parser<")
  101. + BOOST_SPIRIT_GETSTRING(stream)
  102. + std::string(">");
  103. }
  104. template <typename T, typename RealPoliciesT>
  105. inline std::string
  106. parser_name(real_parser<T, RealPoliciesT> const& /*p*/)
  107. {
  108. return std::string("real_parser");
  109. }
  110. ///////////////////////////////////////////////////////////////////////////////
  111. // from operators.hpp
  112. template <typename A, typename B>
  113. inline std::string
  114. parser_name(sequence<A, B> const& p)
  115. {
  116. return std::string("sequence")
  117. + std::string("[")
  118. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  119. + std::string("]");
  120. }
  121. template <typename A, typename B>
  122. inline std::string
  123. parser_name(sequential_or<A, B> const& p)
  124. {
  125. return std::string("sequential_or")
  126. + std::string("[")
  127. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  128. + std::string("]");
  129. }
  130. template <typename A, typename B>
  131. inline std::string
  132. parser_name(alternative<A, B> const& p)
  133. {
  134. return std::string("alternative")
  135. + std::string("[")
  136. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  137. + std::string("]");
  138. }
  139. template <typename A, typename B>
  140. inline std::string
  141. parser_name(intersection<A, B> const& p)
  142. {
  143. return std::string("intersection")
  144. + std::string("[")
  145. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  146. + std::string("]");
  147. }
  148. template <typename A, typename B>
  149. inline std::string
  150. parser_name(difference<A, B> const& p)
  151. {
  152. return std::string("difference")
  153. + std::string("[")
  154. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  155. + std::string("]");
  156. }
  157. template <typename A, typename B>
  158. inline std::string
  159. parser_name(exclusive_or<A, B> const& p)
  160. {
  161. return std::string("exclusive_or")
  162. + std::string("[")
  163. + parser_name(p.left()) + std::string(", ") + parser_name(p.right())
  164. + std::string("]");
  165. }
  166. template <typename S>
  167. inline std::string
  168. parser_name(optional<S> const& p)
  169. {
  170. return std::string("optional")
  171. + std::string("[")
  172. + parser_name(p.subject())
  173. + std::string("]");
  174. }
  175. template <typename S>
  176. inline std::string
  177. parser_name(kleene_star<S> const& p)
  178. {
  179. return std::string("kleene_star")
  180. + std::string("[")
  181. + parser_name(p.subject())
  182. + std::string("]");
  183. }
  184. template <typename S>
  185. inline std::string
  186. parser_name(positive<S> const& p)
  187. {
  188. return std::string("positive")
  189. + std::string("[")
  190. + parser_name(p.subject())
  191. + std::string("]");
  192. }
  193. ///////////////////////////////////////////////////////////////////////////////
  194. // from parser.hpp
  195. template <typename DerivedT>
  196. inline std::string
  197. parser_name(parser<DerivedT> const& /*p*/)
  198. {
  199. return std::string("parser");
  200. }
  201. ///////////////////////////////////////////////////////////////////////////////
  202. // from primitives.hpp
  203. template <typename DerivedT>
  204. inline std::string
  205. parser_name(char_parser<DerivedT> const &/*p*/)
  206. {
  207. return std::string("char_parser");
  208. }
  209. template <typename CharT>
  210. inline std::string
  211. parser_name(chlit<CharT> const &p)
  212. {
  213. return std::string("chlit(\'")
  214. + std::string(1, p.ch)
  215. + std::string("\')");
  216. }
  217. template <typename CharT>
  218. inline std::string
  219. parser_name(range<CharT> const &p)
  220. {
  221. return std::string("range(")
  222. + std::string(1, p.first) + std::string(", ") + std::string(1, p.last)
  223. + std::string(")");
  224. }
  225. template <typename IteratorT>
  226. inline std::string
  227. parser_name(chseq<IteratorT> const &p)
  228. {
  229. return std::string("chseq(\"")
  230. + std::string(p.first, p.last)
  231. + std::string("\")");
  232. }
  233. template <typename IteratorT>
  234. inline std::string
  235. parser_name(strlit<IteratorT> const &p)
  236. {
  237. return std::string("strlit(\"")
  238. + std::string(p.seq.first, p.seq.last)
  239. + std::string("\")");
  240. }
  241. inline std::string
  242. parser_name(nothing_parser const&)
  243. {
  244. return std::string("nothing");
  245. }
  246. inline std::string
  247. parser_name(epsilon_parser const&)
  248. {
  249. return std::string("epsilon");
  250. }
  251. inline std::string
  252. parser_name(anychar_parser const&)
  253. {
  254. return std::string("anychar");
  255. }
  256. inline std::string
  257. parser_name(alnum_parser const&)
  258. {
  259. return std::string("alnum");
  260. }
  261. inline std::string
  262. parser_name(alpha_parser const&)
  263. {
  264. return std::string("alpha");
  265. }
  266. inline std::string
  267. parser_name(cntrl_parser const&)
  268. {
  269. return std::string("cntrl");
  270. }
  271. inline std::string
  272. parser_name(digit_parser const&)
  273. {
  274. return std::string("digit");
  275. }
  276. inline std::string
  277. parser_name(graph_parser const&)
  278. {
  279. return std::string("graph");
  280. }
  281. inline std::string
  282. parser_name(lower_parser const&)
  283. {
  284. return std::string("lower");
  285. }
  286. inline std::string
  287. parser_name(print_parser const&)
  288. {
  289. return std::string("print");
  290. }
  291. inline std::string
  292. parser_name(punct_parser const&)
  293. {
  294. return std::string("punct");
  295. }
  296. inline std::string
  297. parser_name(blank_parser const&)
  298. {
  299. return std::string("blank");
  300. }
  301. inline std::string
  302. parser_name(space_parser const&)
  303. {
  304. return std::string("space");
  305. }
  306. inline std::string
  307. parser_name(upper_parser const&)
  308. {
  309. return std::string("upper");
  310. }
  311. inline std::string
  312. parser_name(xdigit_parser const&)
  313. {
  314. return std::string("xdigit");
  315. }
  316. inline std::string
  317. parser_name(eol_parser const&)
  318. {
  319. return std::string("eol");
  320. }
  321. inline std::string
  322. parser_name(end_parser const&)
  323. {
  324. return std::string("end");
  325. }
  326. ///////////////////////////////////////////////////////////////////////////////
  327. // from rule.hpp
  328. namespace impl {
  329. struct node_registry
  330. {
  331. typedef std::pair<std::string, bool> rule_info;
  332. typedef std::map<void const *, rule_info> rule_infos;
  333. std::string find_node(void const *r)
  334. {
  335. rule_infos::const_iterator cit = infos.find(r);
  336. if (cit != infos.end())
  337. return (*cit).second.first;
  338. return std::string("<unknown>");
  339. }
  340. bool trace_node(void const *r)
  341. {
  342. rule_infos::const_iterator cit = infos.find(r);
  343. if (cit != infos.end())
  344. return (*cit).second.second;
  345. return BOOST_SPIRIT_DEBUG_TRACENODE;
  346. }
  347. bool register_node(void const *r, char const *name_to_register,
  348. bool trace_node)
  349. {
  350. if (infos.find(r) != infos.end())
  351. return false;
  352. return infos.insert(rule_infos::value_type(r,
  353. rule_info(std::string(name_to_register), trace_node))
  354. ).second;
  355. }
  356. bool unregister_node(void const *r)
  357. {
  358. if (infos.find(r) == infos.end())
  359. return false;
  360. return (1 == infos.erase(r));
  361. }
  362. private:
  363. rule_infos infos;
  364. };
  365. inline node_registry &
  366. get_node_registry()
  367. {
  368. static node_registry node_infos;
  369. return node_infos;
  370. }
  371. } // namespace impl
  372. template<
  373. typename DerivedT, typename EmbedT,
  374. typename T0, typename T1, typename T2
  375. >
  376. inline std::string
  377. parser_name(impl::rule_base<DerivedT, EmbedT, T0, T1, T2> const& p)
  378. {
  379. return std::string("rule_base")
  380. + std::string("(")
  381. + impl::get_node_registry().find_node(&p)
  382. + std::string(")");
  383. }
  384. template<typename T0, typename T1, typename T2>
  385. inline std::string
  386. parser_name(rule<T0, T1, T2> const& p)
  387. {
  388. return std::string("rule")
  389. + std::string("(")
  390. + impl::get_node_registry().find_node(&p)
  391. + std::string(")");
  392. }
  393. ///////////////////////////////////////////////////////////////////////////////
  394. // from subrule.hpp
  395. template <typename FirstT, typename RestT>
  396. inline std::string
  397. parser_name(subrule_list<FirstT, RestT> const &p)
  398. {
  399. return std::string("subrule_list")
  400. + std::string("(")
  401. + impl::get_node_registry().find_node(&p)
  402. + std::string(")");
  403. }
  404. template <int ID, typename DefT, typename ContextT>
  405. inline std::string
  406. parser_name(subrule_parser<ID, DefT, ContextT> const &p)
  407. {
  408. return std::string("subrule_parser")
  409. + std::string("(")
  410. + impl::get_node_registry().find_node(&p)
  411. + std::string(")");
  412. }
  413. template <int ID, typename ContextT>
  414. inline std::string
  415. parser_name(subrule<ID, ContextT> const &p)
  416. {
  417. BOOST_SPIRIT_SSTREAM stream;
  418. stream << ID;
  419. return std::string("subrule<")
  420. + BOOST_SPIRIT_GETSTRING(stream)
  421. + std::string(">(")
  422. + impl::get_node_registry().find_node(&p)
  423. + std::string(")");
  424. }
  425. ///////////////////////////////////////////////////////////////////////////////
  426. // from grammar.hpp
  427. template <typename DerivedT, typename ContextT>
  428. inline std::string
  429. parser_name(grammar<DerivedT, ContextT> const& p)
  430. {
  431. return std::string("grammar")
  432. + std::string("(")
  433. + impl::get_node_registry().find_node(&p)
  434. + std::string(")");
  435. }
  436. ///////////////////////////////////////////////////////////////////////////////
  437. // decide, if a node is to be traced or not
  438. template<
  439. typename DerivedT, typename EmbedT,
  440. typename T0, typename T1, typename T2
  441. >
  442. inline bool
  443. trace_parser(impl::rule_base<DerivedT, EmbedT, T0, T1, T2>
  444. const& p)
  445. {
  446. return impl::get_node_registry().trace_node(&p);
  447. }
  448. template<typename T0, typename T1, typename T2>
  449. inline bool
  450. trace_parser(rule<T0, T1, T2> const& p)
  451. {
  452. return impl::get_node_registry().trace_node(&p);
  453. }
  454. template <typename DerivedT, typename ContextT>
  455. inline bool
  456. trace_parser(grammar<DerivedT, ContextT> const& p)
  457. {
  458. return impl::get_node_registry().trace_node(&p);
  459. }
  460. template <typename DerivedT, int N, typename ContextT>
  461. inline bool
  462. trace_parser(impl::entry_grammar<DerivedT, N, ContextT> const& p)
  463. {
  464. return impl::get_node_registry().trace_node(&p);
  465. }
  466. template <int ID, typename ContextT>
  467. bool
  468. trace_parser(subrule<ID, ContextT> const& p)
  469. {
  470. return impl::get_node_registry().trace_node(&p);
  471. }
  472. template <typename ParserT, typename ActorTupleT>
  473. bool
  474. trace_parser(init_closure_parser<ParserT, ActorTupleT> const& p)
  475. {
  476. return impl::get_node_registry().trace_node(&p);
  477. }
  478. ///////////////////////////////////////////////////////////////////////////////
  479. BOOST_SPIRIT_CLASSIC_NAMESPACE_END
  480. }} // namespace boost::spirit
  481. #undef BOOST_SPIRIT_SSTREAM
  482. #undef BOOST_SPIRIT_GETSTRING
  483. #endif // defined(BOOST_SPIRIT_DEBUG)
  484. #endif // !defined(BOOST_SPIRIT_PARSER_NAMES_IPP)