Advertisement
Guest User

Boost Spirit

a guest
Feb 20th, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. namespace RangeGrammar
  2. {
  3.     namespace qi = boost::spirit::qi;
  4.     namespace iso8859_1 = boost::spirit::iso8859_1;
  5.  
  6.     struct RangeResult
  7.     {
  8.         std::wstring start;
  9.         std::wstring limit;
  10.         std::wstring increment;
  11.     };
  12. }
  13.  
  14. BOOST_FUSION_ADAPT_STRUCT(
  15.     RangeGrammar::RangeResult,
  16.     (std::wstring, start)
  17.     (std::wstring, limit)
  18.     (std::wstring, increment)
  19. )
  20.  
  21. namespace RangeGrammar
  22. {
  23.     template <typename Iterator>
  24.     struct range_parser : boost::spirit::qi::grammar<Iterator, RangeResult(), iso8859_1::space_type>
  25.     {
  26.         range_parser() : range_parser::base_type(start)
  27.         {
  28.             using qi::lit;
  29.             using qi::lexeme;
  30.             using qi::int_;
  31.             using iso8859_1::char_;
  32.             using iso8859_1::digit;
  33.  
  34.             variable_string %= lexeme["$(" >> +(char_ - ")") >> ")"];
  35.  
  36.             node = (int_ | variable_string);
  37.  
  38.             start %=
  39.                 lit("_RANGE")
  40.                 >> '('
  41.                 >> node >> ',' >> node >> ',' >> node
  42.                 >> ")_"
  43.                 ;
  44.  
  45.             debug(variable_string);
  46.             debug(start);
  47.  
  48.         }
  49.  
  50.         qi::rule<Iterator, std::wstring(), iso8859_1::space_type> variable_string;
  51.         qi::rule<Iterator, std::wstring(), iso8859_1::space_type> node;
  52.         qi::rule<Iterator, RangeResult(), iso8859_1::space_type> start;
  53.  
  54.     };
  55. }
  56.  
  57. void TestRangeGrammar()
  58. {
  59.     using boost::spirit::iso8859_1::space;
  60.     typedef std::wstring::const_iterator iterator_type;
  61.     typedef RangeGrammar::range_parser<iterator_type> range_parser;
  62.  
  63.     range_parser grammar; // Our grammar
  64.  
  65.     std::array< std::wstring, 1 > testStrings =
  66.     {{
  67.             _TEXT("_RANGE(1, 2, 3 )_")
  68.     }};
  69.  
  70.     for (auto str : testStrings)
  71.     {
  72.  
  73.         std::wstring::const_iterator iter = str.begin();
  74.         std::wstring::const_iterator end = str.end();
  75.  
  76.         RangeGrammar::RangeResult emp;
  77.  
  78.         bool r = phrase_parse(iter, end, grammar, space, emp);
  79.         if (r)
  80.         {
  81.             std::wcout << _TEXT("-------------------------\n");
  82.             std::wcout << _TEXT("Range Parsing succeeded\n");
  83.             std::wcout << _TEXT("Start: ") << emp.start << std::endl;
  84.             std::wcout << _TEXT("Start: ") << emp.limit << std::endl;
  85.             std::wcout << _TEXT("Start: ") << emp.increment << std::endl;
  86.             std::wcout << _TEXT("\n-------------------------\n");
  87.         }
  88.         else
  89.         {
  90.             std::wcout << _TEXT("-------------------------\n");
  91.             std::wcout << _TEXT("Range Parsing failed\n");
  92.             std::wcout << str << std::endl;
  93.             std::wcout << _TEXT("-------------------------\n");
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement