grammar.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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/detail/lightweight_test.hpp>
  7. #include <boost/spirit/include/qi_operator.hpp>
  8. #include <boost/spirit/include/qi_char.hpp>
  9. #include <boost/spirit/include/qi_string.hpp>
  10. #include <boost/spirit/include/qi_numeric.hpp>
  11. #include <boost/spirit/include/qi_nonterminal.hpp>
  12. #include <boost/spirit/include/qi_action.hpp>
  13. #include <boost/spirit/include/phoenix_core.hpp>
  14. #include <boost/spirit/include/phoenix_operator.hpp>
  15. #include <string>
  16. #include <iostream>
  17. #include "test.hpp"
  18. using spirit_test::test;
  19. using spirit_test::test_attr;
  20. using boost::spirit::ascii::space_type;
  21. using boost::spirit::ascii::space;
  22. using boost::spirit::int_;
  23. using boost::spirit::qi::grammar;
  24. using boost::spirit::qi::rule;
  25. using boost::spirit::_val;
  26. using boost::spirit::_r1;
  27. using boost::spirit::lit;
  28. struct num_list : grammar<char const*, space_type>
  29. {
  30. num_list() : base_type(start)
  31. {
  32. using boost::spirit::int_;
  33. num = int_;
  34. start = num >> *(',' >> num);
  35. }
  36. rule<char const*, space_type> start, num;
  37. };
  38. struct inh_g : grammar<char const*, int(int), space_type>
  39. {
  40. inh_g() : base_type(start)
  41. {
  42. start = lit("inherited")[_val = _r1];
  43. }
  44. rule<char const*, int(int), space_type> start, num;
  45. };
  46. struct my_skipper : grammar<char const*>
  47. {
  48. my_skipper() : base_type(start)
  49. {
  50. start = space;
  51. }
  52. rule<char const*> start, num;
  53. };
  54. struct num_list2 : grammar<char const*, my_skipper>
  55. {
  56. num_list2() : base_type(start)
  57. {
  58. using boost::spirit::int_;
  59. num = int_;
  60. start = num >> *(',' >> num);
  61. }
  62. rule<char const*, my_skipper> start, num;
  63. };
  64. template <typename Iterator, typename Skipper>
  65. struct num_list3 : grammar<Iterator, Skipper>
  66. {
  67. template <typename Class>
  68. num_list3(Class&) : grammar<Iterator, Skipper>(start)
  69. {
  70. using boost::spirit::int_;
  71. num = int_;
  72. start = num >> *(',' >> num);
  73. }
  74. rule<Iterator, Skipper> start, num;
  75. };
  76. int
  77. main()
  78. {
  79. { // simple grammar test
  80. num_list nlist;
  81. BOOST_TEST(test("123, 456, 789", nlist, space));
  82. }
  83. { // simple grammar test with user-skipper
  84. num_list2 nlist;
  85. my_skipper skip;
  86. BOOST_TEST(test("123, 456, 789", nlist, skip));
  87. }
  88. { // direct access to the rules
  89. num_list g;
  90. BOOST_TEST(test("123", g.num, space));
  91. BOOST_TEST(test("123, 456, 789", g.start, space));
  92. }
  93. { // grammar with inherited attributes
  94. inh_g g;
  95. int n = -1;
  96. BOOST_TEST(test_attr("inherited", g.start(123), n, space)); // direct to the rule
  97. BOOST_TEST(n == 123);
  98. BOOST_TEST(test_attr("inherited", g(123), n, space)); // using the grammar
  99. BOOST_TEST(n == 123);
  100. }
  101. return boost::report_errors();
  102. }