9
3

directives.ipp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*=============================================================================
  2. Copyright (c) 1998-2003 Joel de Guzman
  3. Copyright (c) 2001 Daniel Nuffer
  4. Copyright (c) 2001 Bruce Florman
  5. Copyright (c) 2002 Raghavendra Satish
  6. http://spirit.sourceforge.net/
  7. Use, modification and distribution is subject to the Boost Software
  8. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  9. http://www.boost.org/LICENSE_1_0.txt)
  10. =============================================================================*/
  11. #if !defined(BOOST_SPIRIT_DIRECTIVES_IPP)
  12. #define BOOST_SPIRIT_DIRECTIVES_IPP
  13. ///////////////////////////////////////////////////////////////////////////////
  14. #include <boost/spirit/home/classic/core/scanner/skipper.hpp>
  15. namespace boost { namespace spirit {
  16. BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
  17. template <typename BaseT>
  18. struct no_skipper_iteration_policy;
  19. template <typename BaseT>
  20. struct inhibit_case_iteration_policy;
  21. template <typename A, typename B>
  22. struct alternative;
  23. template <typename A, typename B>
  24. struct longest_alternative;
  25. template <typename A, typename B>
  26. struct shortest_alternative;
  27. namespace impl
  28. {
  29. template <typename RT, typename ST, typename ScannerT, typename BaseT>
  30. inline RT
  31. contiguous_parser_parse(
  32. ST const& s,
  33. ScannerT const& scan,
  34. skipper_iteration_policy<BaseT> const&)
  35. {
  36. typedef scanner_policies<
  37. no_skipper_iteration_policy<
  38. BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
  39. BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
  40. BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
  41. > policies_t;
  42. scan.skip(scan);
  43. RT hit = s.parse(scan.change_policies(policies_t(scan)));
  44. // We will not do a post skip!!!
  45. return hit;
  46. }
  47. template <typename RT, typename ST, typename ScannerT, typename BaseT>
  48. inline RT
  49. contiguous_parser_parse(
  50. ST const& s,
  51. ScannerT const& scan,
  52. no_skipper_iteration_policy<BaseT> const&)
  53. {
  54. return s.parse(scan);
  55. }
  56. template <typename RT, typename ST, typename ScannerT>
  57. inline RT
  58. contiguous_parser_parse(
  59. ST const& s,
  60. ScannerT const& scan,
  61. iteration_policy const&)
  62. {
  63. return s.parse(scan);
  64. }
  65. template <
  66. typename RT,
  67. typename ParserT,
  68. typename ScannerT,
  69. typename BaseT>
  70. inline RT
  71. implicit_lexeme_parse(
  72. ParserT const& p,
  73. ScannerT const& scan,
  74. skipper_iteration_policy<BaseT> const&)
  75. {
  76. typedef scanner_policies<
  77. no_skipper_iteration_policy<
  78. BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
  79. BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
  80. BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
  81. > policies_t;
  82. scan.skip(scan);
  83. RT hit = p.parse_main(scan.change_policies(policies_t(scan)));
  84. // We will not do a post skip!!!
  85. return hit;
  86. }
  87. template <
  88. typename RT,
  89. typename ParserT,
  90. typename ScannerT,
  91. typename BaseT>
  92. inline RT
  93. implicit_lexeme_parse(
  94. ParserT const& p,
  95. ScannerT const& scan,
  96. no_skipper_iteration_policy<BaseT> const&)
  97. {
  98. return p.parse_main(scan);
  99. }
  100. template <typename RT, typename ParserT, typename ScannerT>
  101. inline RT
  102. implicit_lexeme_parse(
  103. ParserT const& p,
  104. ScannerT const& scan,
  105. iteration_policy const&)
  106. {
  107. return p.parse_main(scan);
  108. }
  109. template <typename RT, typename ST, typename ScannerT>
  110. inline RT
  111. inhibit_case_parser_parse(
  112. ST const& s,
  113. ScannerT const& scan,
  114. iteration_policy const&)
  115. {
  116. typedef scanner_policies<
  117. inhibit_case_iteration_policy<
  118. BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
  119. BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
  120. BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
  121. > policies_t;
  122. return s.parse(scan.change_policies(policies_t(scan)));
  123. }
  124. template <typename RT, typename ST, typename ScannerT, typename BaseT>
  125. inline RT
  126. inhibit_case_parser_parse(
  127. ST const& s,
  128. ScannerT const& scan,
  129. inhibit_case_iteration_policy<BaseT> const&)
  130. {
  131. return s.parse(scan);
  132. }
  133. template <typename T>
  134. struct to_longest_alternative
  135. {
  136. typedef T result_t;
  137. static result_t const&
  138. convert(T const& a) // Special (end) case
  139. { return a; }
  140. };
  141. template <typename A, typename B>
  142. struct to_longest_alternative<alternative<A, B> >
  143. {
  144. typedef typename to_longest_alternative<A>::result_t a_t;
  145. typedef typename to_longest_alternative<B>::result_t b_t;
  146. typedef longest_alternative<a_t, b_t> result_t;
  147. static result_t
  148. convert(alternative<A, B> const& alt) // Recursive case
  149. {
  150. return result_t(
  151. to_longest_alternative<A>::convert(alt.left()),
  152. to_longest_alternative<B>::convert(alt.right()));
  153. }
  154. };
  155. template <typename T>
  156. struct to_shortest_alternative
  157. {
  158. typedef T result_t;
  159. static result_t const&
  160. convert(T const& a) // Special (end) case
  161. { return a; }
  162. };
  163. template <typename A, typename B>
  164. struct to_shortest_alternative<alternative<A, B> >
  165. {
  166. typedef typename to_shortest_alternative<A>::result_t a_t;
  167. typedef typename to_shortest_alternative<B>::result_t b_t;
  168. typedef shortest_alternative<a_t, b_t> result_t;
  169. static result_t
  170. convert(alternative<A, B> const& alt) // Recursive case
  171. {
  172. return result_t(
  173. to_shortest_alternative<A>::convert(alt.left()),
  174. to_shortest_alternative<B>::convert(alt.right()));
  175. }
  176. };
  177. }
  178. BOOST_SPIRIT_CLASSIC_NAMESPACE_END
  179. }} // namespace boost::spirit
  180. #endif