grammar_def_test.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. //
  2. // Copyright (c) 2005 Joao Abecasis
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. #include <boost/spirit/include/classic_core.hpp>
  9. #include <boost/spirit/include/classic_attribute.hpp>
  10. #include <boost/spirit/include/classic_grammar_def.hpp>
  11. struct my_grammar1
  12. : BOOST_SPIRIT_CLASSIC_NS::grammar<my_grammar1>
  13. {
  14. template <typename Scanner>
  15. struct definition
  16. : BOOST_SPIRIT_CLASSIC_NS::grammar_def<
  17. BOOST_SPIRIT_CLASSIC_NS::rule<Scanner>,
  18. BOOST_SPIRIT_CLASSIC_NS::same
  19. >
  20. {
  21. definition(my_grammar1 const &)
  22. {
  23. BOOST_SPIRIT_DEBUG_NODE(start_rule1);
  24. BOOST_SPIRIT_DEBUG_NODE(start_rule2);
  25. start_rule1 = BOOST_SPIRIT_CLASSIC_NS::str_p("int");
  26. start_rule2 = BOOST_SPIRIT_CLASSIC_NS::int_p;
  27. this->start_parsers(start_rule1, start_rule2);
  28. }
  29. BOOST_SPIRIT_CLASSIC_NS::rule<Scanner>
  30. start_rule1,
  31. start_rule2;
  32. };
  33. };
  34. struct my_closure : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure, int>
  35. {
  36. member1 value;
  37. };
  38. struct my_grammar2
  39. : BOOST_SPIRIT_CLASSIC_NS::grammar<my_grammar2, my_closure::context_t>
  40. {
  41. template <typename Scanner>
  42. struct definition
  43. : BOOST_SPIRIT_CLASSIC_NS::grammar_def<
  44. BOOST_SPIRIT_CLASSIC_NS::rule<Scanner>,
  45. BOOST_SPIRIT_CLASSIC_NS::same
  46. >
  47. {
  48. definition(my_grammar2 const &)
  49. {
  50. BOOST_SPIRIT_DEBUG_NODE(start_rule1);
  51. BOOST_SPIRIT_DEBUG_NODE(start_rule2);
  52. start_rule1 = BOOST_SPIRIT_CLASSIC_NS::str_p("int");
  53. start_rule2 = BOOST_SPIRIT_CLASSIC_NS::int_p;
  54. this->start_parsers(start_rule1, start_rule2);
  55. }
  56. BOOST_SPIRIT_CLASSIC_NS::rule<Scanner>
  57. start_rule1,
  58. start_rule2;
  59. };
  60. };
  61. int main()
  62. {
  63. my_grammar1 g1;
  64. my_grammar2 g2;
  65. BOOST_SPIRIT_DEBUG_NODE(g1);
  66. BOOST_SPIRIT_DEBUG_NODE(g2);
  67. parse(
  68. "int 5",
  69. g1.use_parser<0>() >> g2.use_parser<1>(),
  70. BOOST_SPIRIT_CLASSIC_NS::space_p
  71. );
  72. }