subrule.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright (c) 2001-2010 Hartmut Kaiser
  2. // Copyright (c) 2009 Francois Barel
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/config/warning_disable.hpp>
  7. #include <boost/detail/lightweight_test.hpp>
  8. #include <boost/spirit/include/karma_operator.hpp>
  9. #include <boost/spirit/include/karma_char.hpp>
  10. #include <boost/spirit/include/karma_auxiliary.hpp>
  11. #include <boost/spirit/include/karma_string.hpp>
  12. #include <boost/spirit/include/karma_numeric.hpp>
  13. #include <boost/spirit/include/karma_nonterminal.hpp>
  14. #include <boost/spirit/include/karma_action.hpp>
  15. #include <boost/spirit/include/phoenix_core.hpp>
  16. #include <boost/spirit/include/phoenix_operator.hpp>
  17. #include <boost/spirit/include/phoenix_statement.hpp>
  18. #include <boost/spirit/include/phoenix_fusion.hpp>
  19. #include <boost/spirit/repository/include/karma_subrule.hpp>
  20. #include "test.hpp"
  21. using namespace spirit_test;
  22. ///////////////////////////////////////////////////////////////////////////////
  23. int main()
  24. {
  25. using namespace boost;
  26. using namespace boost::spirit;
  27. using namespace boost::spirit::karma;
  28. // using namespace boost::spirit::ascii;
  29. using boost::spirit::repository::karma::subrule;
  30. typedef spirit_test::output_iterator<char>::type outiter_type;
  31. // basic tests
  32. {
  33. rule<outiter_type> start;
  34. subrule<0> sr;
  35. start = (
  36. sr = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4]
  37. );
  38. BOOST_TEST(test("a1012.4", start));
  39. BOOST_TEST(test("a1012.4", (
  40. sr = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4]
  41. )));
  42. subrule<1> a;
  43. subrule<2> b;
  44. subrule<3> c;
  45. start = (
  46. sr = a << b << c
  47. , a = char_[_1 = 'a']
  48. , b = int_[_1 = 10]
  49. , c = double_[_1 = 12.4]
  50. );
  51. BOOST_TEST(test("a1012.4", start));
  52. }
  53. // basic tests with delimiter
  54. {
  55. rule<outiter_type, space_type> start;
  56. subrule<0> sr;
  57. start = (
  58. sr = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4]
  59. );
  60. BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
  61. BOOST_TEST(test_delimited("a 10 12.4 ", (
  62. sr = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4]
  63. ), space));
  64. subrule<1> a;
  65. subrule<2> b;
  66. subrule<3> c;
  67. start = (
  68. sr = a << b << c
  69. , a = char_[_1 = 'a']
  70. , b = int_[_1 = 10]
  71. , c = double_[_1 = 12.4]
  72. );
  73. BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
  74. }
  75. // basic tests involving a direct parameter
  76. {
  77. typedef variant<char, int, double> var_type;
  78. rule<outiter_type, var_type()> start;
  79. subrule<0, var_type()> sr;
  80. start = (
  81. sr = (char_ | int_ | double_)[_1 = _r0]
  82. )[_1 = _val];
  83. var_type v ('a');
  84. BOOST_TEST(test("a", start, v));
  85. v = 10;
  86. BOOST_TEST(test("10", start, v));
  87. v = 12.4;
  88. BOOST_TEST(test("12.4", start, v));
  89. }
  90. {
  91. typedef variant<char, int, double> var_type;
  92. rule<outiter_type, space_type, var_type()> start;
  93. subrule<0, var_type()> sr;
  94. start %= (
  95. sr = (char_ | int_ | double_)[_1 = _r0]
  96. );
  97. var_type v ('a');
  98. BOOST_TEST(test_delimited("a ", start, v, space));
  99. v = 10;
  100. BOOST_TEST(test_delimited("10 ", start, v, space));
  101. v = 12.4;
  102. BOOST_TEST(test_delimited("12.4 ", start, v, space));
  103. }
  104. {
  105. rule<outiter_type, void(char, int, double)> start;
  106. subrule<0, void(char, int, double)> sr;
  107. start = (
  108. sr = char_[_1 = _r1] << int_[_1 = _r2] << double_[_1 = _r3]
  109. )(_r1, _r2, _r3);
  110. BOOST_TEST(test("a1012.4", start('a', 10, 12.4)));
  111. BOOST_TEST(test("a1012.4", (
  112. sr = (char_ << int_ << double_)[_1 = _r1, _2 = _r2, _3 = _r3]
  113. )('a', 10, 12.4)));
  114. subrule<1, void(char, int, double)> entry;
  115. subrule<2, void(char)> a;
  116. subrule<3, void(int)> b;
  117. subrule<4, void(double)> c;
  118. start = (
  119. entry = a(_r1) << b(_r2) << c(_r3)
  120. , a = char_[_1 = _r1]
  121. , b = int_[_1 = _r1]
  122. , c = double_[_1 = _r1]
  123. )(_r1, _r2, _r3);
  124. BOOST_TEST(test("a1012.4", start('a', 10, 12.4)));
  125. }
  126. {
  127. rule<outiter_type, space_type, void(char, int, double)> start;
  128. subrule<0, void(char, int, double)> sr;
  129. start = (
  130. sr = char_[_1 = _r1] << int_[_1 = _r2] << double_[_1 = _r3]
  131. )(_r1, _r2, _r3);
  132. BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
  133. BOOST_TEST(test_delimited("a 10 12.4 ", (
  134. sr = (char_ << int_ << double_)[_1 = _r1, _2 = _r2, _3 = _r3]
  135. )('a', 10, 12.4), space));
  136. subrule<1, void(char, int, double)> entry;
  137. subrule<2, void(char)> a;
  138. subrule<3, void(int)> b;
  139. subrule<4, void(double)> c;
  140. start = (
  141. entry = a(_r1) << b(_r2) << c(_r3)
  142. , a = char_[_1 = _r1]
  143. , b = int_[_1 = _r1]
  144. , c = double_[_1 = _r1]
  145. )(_r1, _r2, _r3);
  146. BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
  147. }
  148. return boost::report_errors();
  149. }