Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 15th, 2010 | Syntax: None | Size: 3.18 KB | Hits: 50 | Expires: Never
Copy text to clipboard
  1. #include <boost/spirit/include/qi.hpp>
  2. #include <boost/spirit/include/phoenix_core.hpp>
  3. #include <boost/spirit/include/phoenix_operator.hpp>
  4. #include <boost/spirit/include/phoenix_object.hpp>
  5. #include <boost/fusion/include/adapt_struct.hpp>
  6. #include <boost/fusion/include/io.hpp>
  7.  
  8. #include <iostream>
  9. #include <string>
  10.  
  11. namespace qi = boost::spirit::qi;
  12. namespace ascii = boost::spirit::ascii;
  13. namespace phx = boost::phoenix;
  14.  
  15. namespace client
  16. {
  17.     struct print_action
  18.     {
  19.         void operator()(int const& i, qi::unused_type, qi::unused_type) const
  20.         {
  21.             std::cout << i << std::endl;
  22.         }
  23.     };
  24.  
  25.     template <typename Iterator, typename Skipper>
  26.     struct grammer : qi::grammar<Iterator, std::vector<int>(), Skipper>
  27.     {
  28.         grammer() : grammer::base_type(start), comment_char( '|' )
  29.         {
  30.             using ascii::no_case;
  31.             using qi::_val;
  32.             using qi::_1;
  33.             using qi::lexeme;
  34.             using qi::omit;
  35.             using qi::char_;
  36.             using qi::no_skip;
  37.             using qi::char_;
  38.             using qi::int_;
  39.             using qi::eol;
  40.  
  41.             comment =
  42.                 char_( phx::ref( comment_char ) )
  43.                 >> *( char_ - eol ) >> eol
  44.                 ;
  45.  
  46.             data %=
  47.                 int_ >> *( ',' >> int_ )
  48.                 ;
  49.  
  50.             start =  comment | data
  51.                 ;
  52.  
  53.             BOOST_SPIRIT_DEBUG_NODE( comment );
  54.             BOOST_SPIRIT_DEBUG_NODE( data );
  55.             BOOST_SPIRIT_DEBUG_NODE( start );
  56.         }
  57.  
  58.         char comment_char;
  59.         qi::rule<Iterator, Skipper> comment;
  60.         qi::rule<Iterator, std::vector<int>(), Skipper> data;
  61.         qi::rule<Iterator, std::vector<int>(), Skipper> start;
  62.     };
  63. }
  64.  
  65. int main(int argc, char * argv[])
  66. {
  67.     typedef const char* Iterator;
  68.  
  69.     Iterator iter =
  70.         "| default comment\n"
  71.         "|4,"
  72.         "| default comment\n"
  73.         "2"
  74.         ;
  75.     Iterator end  = iter + std::strlen(iter);
  76.  
  77.     typedef const char* Iterator;
  78.     typedef client::grammer<Iterator, ascii::space_type> grammar_type;
  79.     grammar_type g;
  80.     std::vector<int> v;
  81.  
  82.     bool r = phrase_parse(iter, end, g, ascii::space, v);
  83.  
  84.     if (r && iter == end)
  85.     {
  86.         std::cout << "-------------------------\n";
  87.         std::cout << "Parsing succeeded\n";
  88.         std::cout << v[0] << "," << v[1] << std::endl;
  89.         std::cout << "-------------------------\n";
  90.     }
  91.     else
  92.     {
  93.         std::string rest(iter, end);
  94.         std::cout << "-------------------------\n";
  95.         std::cout << "Parsing failed\n";
  96.         std::cout << "stopped at: \"" << rest << "\"\n";
  97.         std::cout << "-------------------------\n";
  98.     }
  99.  
  100.     return 0;
  101. }
  102.  
  103. $ g++ -DBOOST_SPIRIT_DEBUG -I /home/olaf/Projects/programming/cpp/boost/trunk/ support.cpp -o support && ./support
  104. <start>
  105.   <try>| default comment\n|4</try>
  106. <comment>
  107.   <try>| default comment\n|4</try>
  108.   <fail/>
  109. </comment>
  110.   <data>
  111.     <try>| default comment\n|4</try>
  112.     <fail/>
  113.   </data>
  114.   <fail/>
  115. </start>
  116. -------------------------
  117. Parsing failed
  118. stopped at: "| default comment
  119. |4,| default comment
  120. 2"
  121. -------------------------