lazy.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 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_char.hpp>
  8. #include <boost/spirit/include/qi_string.hpp>
  9. #include <boost/spirit/include/qi_numeric.hpp>
  10. #include <boost/spirit/include/qi_auxiliary.hpp>
  11. #include <boost/spirit/include/qi_action.hpp>
  12. #include <boost/spirit/include/qi_nonterminal.hpp>
  13. #include <boost/spirit/include/qi_operator.hpp>
  14. #include <boost/spirit/include/support_argument.hpp>
  15. #include <boost/spirit/include/phoenix_core.hpp>
  16. #include <boost/spirit/include/phoenix_operator.hpp>
  17. #include <iostream>
  18. #include "test.hpp"
  19. int
  20. main()
  21. {
  22. using spirit_test::test;
  23. using spirit_test::test_attr;
  24. namespace qi = boost::spirit::qi;
  25. using boost::spirit::qi::_1;
  26. using boost::spirit::qi::_val;
  27. using boost::spirit::qi::int_;
  28. using boost::spirit::qi::rule;
  29. using boost::spirit::ascii::char_;
  30. using boost::phoenix::val;
  31. using boost::phoenix::ref;
  32. {
  33. BOOST_TEST(test("123", val(int_)));
  34. }
  35. {
  36. int result;
  37. BOOST_TEST(test("123", qi::lazy(val(int_))[ref(result) = _1]));
  38. BOOST_TEST((result == 123));
  39. }
  40. {
  41. rule<char const*, char()> r;
  42. r = char_[_val = _1] >> *qi::lazy(_val);
  43. BOOST_TEST(test("aaaaaaaaaaaa", r));
  44. BOOST_TEST(!test("abbbbbbbbbb", r));
  45. BOOST_TEST(test("bbbbbbbbbbb", r));
  46. }
  47. {
  48. rule<char const*, std::string()> r;
  49. r =
  50. '<' >> *(char_ - '>')[_val += _1] >> '>'
  51. >> "</" >> qi::lazy(_val) >> '>'
  52. ;
  53. BOOST_TEST(test("<tag></tag>", r));
  54. BOOST_TEST(!test("<foo></bar>", r));
  55. }
  56. return boost::report_errors();
  57. }