match_manip3.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*=============================================================================
  2. Copyright (c) 2001-2010 Hartmut Kaiser
  3. Copyright (c) 2001-2010 Joel de Guzman
  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. =============================================================================*/
  7. #include "match_manip.hpp"
  8. int
  9. main()
  10. {
  11. using boost::spirit::qi::_1;
  12. using boost::spirit::qi::_2;
  13. using boost::spirit::qi::match;
  14. using boost::spirit::qi::phrase_match;
  15. using boost::spirit::qi::typed_stream;
  16. using boost::spirit::qi::stream;
  17. using boost::spirit::qi::int_;
  18. using namespace boost::spirit::ascii;
  19. namespace fusion = boost::fusion;
  20. namespace phx = boost::phoenix;
  21. {
  22. char a = '\0';
  23. int i = 0;
  24. BOOST_TEST(test( "a2",
  25. (char_ >> int_)[phx::ref(a) = _1, phx::ref(i) = _2]
  26. ) && a == 'a' && i == 2);
  27. fusion::vector<char, int> t;
  28. BOOST_TEST(test( "a2",
  29. match(char_ >> int_, t)
  30. ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
  31. t = fusion::vector<char, int>();
  32. BOOST_TEST(test( " a 2",
  33. phrase_match(char_ >> int_, space, t)
  34. ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
  35. BOOST_TEST(!test( "a2",
  36. match(char_ >> alpha, t)
  37. ));
  38. BOOST_TEST(!test( " a 2",
  39. phrase_match(char_ >> alpha, space, t)
  40. ));
  41. }
  42. {
  43. // parse elements of a vector
  44. std::vector<char> v;
  45. BOOST_TEST(test( "abc",
  46. (*char_)[phx::ref(v) = _1]
  47. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  48. v.clear();
  49. BOOST_TEST(test( "abc",
  50. match(*char_, v)
  51. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  52. v.clear();
  53. BOOST_TEST(test( " a b c",
  54. phrase_match(*char_, space, v)
  55. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  56. v.clear();
  57. BOOST_TEST(test( "abc",
  58. match(v)
  59. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  60. v.clear();
  61. BOOST_TEST(test( " a b c",
  62. phrase_match(v, space)
  63. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  64. // parse a comma separated list of vector elements
  65. v.clear();
  66. BOOST_TEST(test( "a,b,c",
  67. match(char_ % ',', v)
  68. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  69. v.clear();
  70. BOOST_TEST(test( " a , b , c",
  71. phrase_match(char_ % ',', space, v)
  72. ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
  73. // output all elements of a list
  74. std::list<char> l;
  75. BOOST_TEST(test( "abc",
  76. match(*char_, l)
  77. ) && 3 == l.size() && is_list_ok(l));
  78. l.clear();
  79. BOOST_TEST(test( " a b c",
  80. phrase_match(*char_, space, l)
  81. ) && 3 == l.size() && is_list_ok(l));
  82. l.clear();
  83. BOOST_TEST(test( "abc",
  84. match(l)
  85. ) && 3 == l.size() && is_list_ok(l));
  86. l.clear();
  87. BOOST_TEST(test( " a b c",
  88. phrase_match(l, space)
  89. ) && 3 == l.size() && is_list_ok(l));
  90. }
  91. return boost::report_errors();
  92. }