pattern2.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright (c) 2001-2011 Hartmut Kaiser
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/config/warning_disable.hpp>
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/include/karma_operator.hpp>
  8. #include <boost/spirit/include/karma_char.hpp>
  9. #include <boost/spirit/include/karma_auxiliary.hpp>
  10. #include <boost/spirit/include/karma_string.hpp>
  11. #include <boost/spirit/include/karma_numeric.hpp>
  12. #include <boost/spirit/include/karma_nonterminal.hpp>
  13. #include <boost/spirit/include/karma_action.hpp>
  14. #include <boost/spirit/include/phoenix_core.hpp>
  15. #include <boost/spirit/include/phoenix_operator.hpp>
  16. #include "test.hpp"
  17. using namespace spirit_test;
  18. ///////////////////////////////////////////////////////////////////////////////
  19. int main()
  20. {
  21. using namespace boost;
  22. using namespace boost::spirit;
  23. using namespace boost::spirit::ascii;
  24. typedef spirit_test::output_iterator<char>::type outiter_type;
  25. // locals test
  26. {
  27. karma::rule<outiter_type, locals<std::string> > start;
  28. start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
  29. BOOST_TEST(test("abc10abc", start));
  30. }
  31. {
  32. karma::rule<outiter_type, space_type, locals<std::string> > start;
  33. start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
  34. BOOST_TEST(test_delimited("abc 10 abc ", start, space));
  35. }
  36. // alias tests
  37. {
  38. typedef variant<char, int, double> var_type;
  39. karma::rule<outiter_type, var_type()> d, start;
  40. d = start.alias(); // d will always track start
  41. start = (char_ | int_ | double_)[_1 = _val];
  42. var_type v ('a');
  43. BOOST_TEST(test("a", d, v));
  44. v = 10;
  45. BOOST_TEST(test("10", d, v));
  46. v = 12.4;
  47. BOOST_TEST(test("12.4", d, v));
  48. }
  49. {
  50. typedef variant<char, int, double> var_type;
  51. karma::rule<outiter_type, space_type, var_type()> d, start;
  52. d = start.alias(); // d will always track start
  53. start = (char_ | int_ | double_)[_1 = _val];
  54. var_type v ('a');
  55. BOOST_TEST(test_delimited("a ", d, v, space));
  56. v = 10;
  57. BOOST_TEST(test_delimited("10 ", d, v, space));
  58. v = 12.4;
  59. BOOST_TEST(test_delimited("12.4 ", d, v, space));
  60. }
  61. {
  62. typedef variant<char, int, double> var_type;
  63. karma::rule<outiter_type, var_type()> d, start;
  64. d = start.alias(); // d will always track start
  65. start %= char_ | int_ | double_;
  66. var_type v ('a');
  67. BOOST_TEST(test("a", d, v));
  68. v = 10;
  69. BOOST_TEST(test("10", d, v));
  70. v = 12.4;
  71. BOOST_TEST(test("12.4", d, v));
  72. start = char_ | int_ | double_;
  73. v = 'a';
  74. BOOST_TEST(test("a", d, v));
  75. v = 10;
  76. BOOST_TEST(test("10", d, v));
  77. v = 12.4;
  78. BOOST_TEST(test("12.4", d, v));
  79. }
  80. {
  81. typedef variant<char, int, double> var_type;
  82. karma::rule<outiter_type, space_type, var_type()> d, start;
  83. d = start.alias(); // d will always track start
  84. start %= char_ | int_ | double_;
  85. var_type v ('a');
  86. BOOST_TEST(test_delimited("a ", d, v, space));
  87. v = 10;
  88. BOOST_TEST(test_delimited("10 ", d, v, space));
  89. v = 12.4;
  90. BOOST_TEST(test_delimited("12.4 ", d, v, space));
  91. start = char_ | int_ | double_;
  92. v = 'a';
  93. BOOST_TEST(test_delimited("a ", d, v, space));
  94. v = 10;
  95. BOOST_TEST(test_delimited("10 ", d, v, space));
  96. v = 12.4;
  97. BOOST_TEST(test_delimited("12.4 ", d, v, space));
  98. }
  99. ///////////////////////////////////////////////////////////////////////////
  100. {
  101. using boost::spirit::karma::int_;
  102. using boost::spirit::karma::_1;
  103. using boost::spirit::karma::_val;
  104. using boost::spirit::karma::space;
  105. using boost::spirit::karma::space_type;
  106. karma::rule<outiter_type, int()> r1 = int_;
  107. karma::rule<outiter_type, space_type, int()> r2 = int_;
  108. int i = 123;
  109. int j = 456;
  110. BOOST_TEST(test("123", r1[_1 = _val], i));
  111. BOOST_TEST(test_delimited("456 ", r2[_1 = _val], j, space));
  112. }
  113. return boost::report_errors();
  114. }