Advertisement
Guest User

Untitled

a guest
Jan 25th, 2013
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include <boost/config/warning_disable.hpp>
  2. #include <boost/spirit/include/qi.hpp>
  3. #include <boost/spirit/include/phoenix_core.hpp>
  4. #include <boost/spirit/include/phoenix_operator.hpp>
  5. #include <boost/spirit/include/phoenix_object.hpp>
  6. #include <boost/fusion/include/adapt_struct.hpp>
  7. #include <boost/fusion/include/adapt_struct_named.hpp>
  8. #include <boost/fusion/include/io.hpp>
  9. #include <iostream>
  10. #include <string>
  11. #include <complex>
  12.  
  13. namespace bsq = boost::spirit::qi;
  14. namespace bph = boost::phoenix;
  15.  
  16. struct SomeEnums
  17. {
  18.     enum CompareType
  19.     {
  20.         Exists      = 0x0000,
  21.         NotExists   = 0x0001
  22.     };
  23. };
  24.  
  25. namespace client
  26. {
  27.  
  28. struct UnaryExpression
  29. {
  30.     std::string key;
  31.     SomeEnums::CompareType op;
  32. };
  33.  
  34. }
  35.  
  36. BOOST_FUSION_ADAPT_STRUCT(
  37.     client::UnaryExpression,
  38.     (std::string, key)
  39.     (SomeEnums::CompareType, op)
  40. )
  41.  
  42. BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(
  43.     client::UnaryExpression,
  44.     (client),
  45.     UnaryFunction,
  46.     (SomeEnums::CompareType, op)
  47.     (std::string, key)
  48. )
  49.  
  50. struct UnaryOps : bsq::symbols<char, SomeEnums::CompareType>
  51. {
  52.     UnaryOps() : bsq::symbols<char, SomeEnums::CompareType>(std::string("UnaryOps"))
  53.     {
  54.         add("exists", SomeEnums::Exists)
  55.            ("nexists", SomeEnums::NotExists);
  56.     }
  57. };
  58.  
  59. namespace client
  60. {
  61. template<typename Iterator>
  62. struct test_parser : bsq::grammar<Iterator, client::UnaryExpression(), bsq::ascii::space_type>
  63. {
  64.     test_parser()
  65.         : test_parser::base_type(unaryExp, std::string("Test"))
  66.     {
  67.         using bsq::no_case;
  68.  
  69.         key %= bsq::lexeme[bsq::alnum >> +(bsq::alnum | bsq::char_('.'))];
  70.  
  71.         unaryExp %= unaryE | unaryF;
  72.         unaryE %= key >> no_case[unaryOps];
  73.         unaryF %= no_case[unaryOps] >> '(' >> key >> ')';
  74.     };
  75.  
  76.     UnaryOps unaryOps;
  77.  
  78.     bsq::rule<Iterator, std::string(), bsq::ascii::space_type> key;
  79.     bsq::rule<Iterator, client::UnaryExpression(), bsq::ascii::space_type> unaryExp;
  80.     bsq::rule<Iterator, client::UnaryExpression(), bsq::ascii::space_type> unaryE;
  81.     bsq::rule<Iterator, client::UnaryFunction(), bsq::ascii::space_type> unaryF;
  82. };
  83. }
  84.  
  85. int main(int argc, char ** argv)
  86. {
  87.     std::string str;
  88.  
  89.     while (std::getline(std::cin, str))
  90.     {
  91.         client::test_parser<std::string::const_iterator> parser;
  92.         client::UnaryExpression exp;
  93.  
  94.         if (str.empty() || str[0] == 'q' || str[0] == 'Q')
  95.             break;
  96.  
  97.         std::string::const_iterator iter = str.begin();
  98.         std::string::const_iterator end = str.end();
  99.         bool r = phrase_parse(iter, end, parser, bsq::ascii::space, exp);
  100.  
  101.         if (r && iter == end)
  102.         {
  103.             std::cout << "-------------------------\n";
  104.             std::cout << "Parsing succeeded\n";
  105.             std::cout << "key: " << exp.key << "\n";
  106.             std::cout << "op : " << exp.op << "\n";
  107.             std::cout << "-------------------------\n";
  108.         }
  109.         else
  110.         {
  111.             std::cout << "-------------------------\n";
  112.             std::cout << "Parsing failed\n";
  113.             std::cout << "-------------------------\n";
  114.         }
  115.  
  116.         str.clear();
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement