symbols1.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*=============================================================================
  2. Copyright (c) 2001-2010 Joel de Guzman
  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. =============================================================================*/
  6. #include <boost/spirit/include/qi_string.hpp>
  7. #include <boost/spirit/include/qi_char.hpp>
  8. #include <boost/spirit/include/qi_action.hpp>
  9. #include <boost/spirit/include/qi_auxiliary.hpp>
  10. #include <boost/spirit/include/qi_directive.hpp>
  11. #include <boost/spirit/include/qi_operator.hpp>
  12. #include <boost/spirit/include/qi_nonterminal.hpp>
  13. #include <boost/spirit/include/support_argument.hpp>
  14. #include <boost/spirit/include/phoenix_core.hpp>
  15. #include <boost/spirit/include/phoenix_operator.hpp>
  16. #include <boost/core/lightweight_test.hpp>
  17. #include <boost/core/lightweight_test_trait.hpp>
  18. #include <iostream>
  19. #include "test.hpp"
  20. // Custom string type with a C-style string conversion.
  21. struct custom_string_c
  22. {
  23. custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
  24. operator char*() { return str; }
  25. operator char const*() const { return str; }
  26. private:
  27. char str[2];
  28. };
  29. int
  30. main()
  31. {
  32. using spirit_test::test;
  33. using spirit_test::test_attr;
  34. using boost::spirit::qi::symbols;
  35. using boost::spirit::qi::rule;
  36. using boost::spirit::qi::lazy;
  37. using boost::spirit::qi::_r1;
  38. { // basics
  39. symbols<char, int> sym;
  40. sym.add
  41. ("Joel")
  42. ("Ruby")
  43. ("Tenji")
  44. ("Tutit")
  45. ("Kim")
  46. ("Joey")
  47. ("Joeyboy")
  48. ;
  49. BOOST_TEST_TRAIT_TRUE((boost::spirit::traits::is_parser<symbols<char, int> >));
  50. BOOST_TEST((test("Joel", sym)));
  51. BOOST_TEST((test("Ruby", sym)));
  52. BOOST_TEST((test("Tenji", sym)));
  53. BOOST_TEST((test("Tutit", sym)));
  54. BOOST_TEST((test("Kim", sym)));
  55. BOOST_TEST((test("Joey", sym)));
  56. BOOST_TEST((test("Joeyboy", sym)));
  57. BOOST_TEST((!test("XXX", sym)));
  58. // test copy
  59. symbols<char, int> sym2;
  60. sym2 = sym;
  61. BOOST_TEST((test("Joel", sym2)));
  62. BOOST_TEST((test("Ruby", sym2)));
  63. BOOST_TEST((test("Tenji", sym2)));
  64. BOOST_TEST((test("Tutit", sym2)));
  65. BOOST_TEST((test("Kim", sym2)));
  66. BOOST_TEST((test("Joey", sym2)));
  67. BOOST_TEST((!test("XXX", sym2)));
  68. // make sure it plays well with other parsers
  69. BOOST_TEST((test("Joelyo", sym >> "yo")));
  70. sym.remove
  71. ("Joel")
  72. ("Ruby")
  73. ;
  74. BOOST_TEST((!test("Joel", sym)));
  75. BOOST_TEST((!test("Ruby", sym)));
  76. }
  77. { // comma syntax
  78. symbols<char, int> sym;
  79. sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
  80. BOOST_TEST((test("Joel", sym)));
  81. BOOST_TEST((test("Ruby", sym)));
  82. BOOST_TEST((test("Tenji", sym)));
  83. BOOST_TEST((test("Tutit", sym)));
  84. BOOST_TEST((test("Kim", sym)));
  85. BOOST_TEST((test("Joey", sym)));
  86. BOOST_TEST((!test("XXX", sym)));
  87. sym -= "Joel", "Ruby";
  88. BOOST_TEST((!test("Joel", sym)));
  89. BOOST_TEST((!test("Ruby", sym)));
  90. }
  91. { // no-case handling
  92. using namespace boost::spirit::ascii;
  93. symbols<char, int> sym;
  94. // NOTE: make sure all entries are in lower-case!!!
  95. sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
  96. BOOST_TEST((test("joel", no_case[sym])));
  97. BOOST_TEST((test("ruby", no_case[sym])));
  98. BOOST_TEST((test("tenji", no_case[sym])));
  99. BOOST_TEST((test("tutit", no_case[sym])));
  100. BOOST_TEST((test("kim", no_case[sym])));
  101. BOOST_TEST((test("joey", no_case[sym])));
  102. BOOST_TEST((test("JOEL", no_case[sym])));
  103. BOOST_TEST((test("RUBY", no_case[sym])));
  104. BOOST_TEST((test("TENJI", no_case[sym])));
  105. BOOST_TEST((test("TUTIT", no_case[sym])));
  106. BOOST_TEST((test("KIM", no_case[sym])));
  107. BOOST_TEST((test("JOEY", no_case[sym])));
  108. // make sure it plays well with other parsers
  109. BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
  110. }
  111. { // attributes
  112. symbols<char, int> sym;
  113. sym.add
  114. ("Joel", 1)
  115. ("Ruby", 2)
  116. ("Tenji", 3)
  117. ("Tutit", 4)
  118. ("Kim", 5)
  119. ("Joey", 6)
  120. ("Joeyboy", 7)
  121. ;
  122. int i;
  123. BOOST_TEST((test_attr("Joel", sym, i)));
  124. BOOST_TEST(i == 1);
  125. BOOST_TEST((test_attr("Ruby", sym, i)));
  126. BOOST_TEST(i == 2);
  127. BOOST_TEST((test_attr("Tenji", sym, i)));
  128. BOOST_TEST(i == 3);
  129. BOOST_TEST((test_attr("Tutit", sym, i)));
  130. BOOST_TEST(i == 4);
  131. BOOST_TEST((test_attr("Kim", sym, i)));
  132. BOOST_TEST(i == 5);
  133. BOOST_TEST((test_attr("Joey", sym, i)));
  134. BOOST_TEST(i == 6);
  135. BOOST_TEST((test_attr("Joeyboy", sym, i)));
  136. BOOST_TEST(i == 7);
  137. BOOST_TEST((!test_attr("XXX", sym, i)));
  138. // double add:
  139. sym.add("Joel", 265);
  140. BOOST_TEST((test_attr("Joel", sym, i)));
  141. BOOST_TEST(i == 1);
  142. }
  143. { // actions
  144. namespace phx = boost::phoenix;
  145. using boost::spirit::_1;
  146. symbols<char, int> sym;
  147. sym.add
  148. ("Joel", 1)
  149. ("Ruby", 2)
  150. ("Tenji", 3)
  151. ("Tutit", 4)
  152. ("Kim", 5)
  153. ("Joey", 6)
  154. ;
  155. int i;
  156. BOOST_TEST((test("Joel", sym[phx::ref(i) = _1])));
  157. BOOST_TEST(i == 1);
  158. BOOST_TEST((test("Ruby", sym[phx::ref(i) = _1])));
  159. BOOST_TEST(i == 2);
  160. BOOST_TEST((test("Tenji", sym[phx::ref(i) = _1])));
  161. BOOST_TEST(i == 3);
  162. BOOST_TEST((test("Tutit", sym[phx::ref(i) = _1])));
  163. BOOST_TEST(i == 4);
  164. BOOST_TEST((test("Kim", sym[phx::ref(i) = _1])));
  165. BOOST_TEST(i == 5);
  166. BOOST_TEST((test("Joey", sym[phx::ref(i) = _1])));
  167. BOOST_TEST(i == 6);
  168. BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
  169. }
  170. return boost::report_errors();
  171. }