1 /*============================================================================= 2 Copyright (c) 2002-2003 Joel de Guzman 3 http://spirit.sourceforge.net/ 4 5 Use, modification and distribution is subject to the Boost Software 6 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 7 http://www.boost.org/LICENSE_1_0.txt) 8 =============================================================================*/ 9 /////////////////////////////////////////////////////////////////////////////// 10 // 11 // Boiler plate [ A template for writing your parser ] 12 // 13 // [ JDG 9/17/2002 ] 14 // 15 /////////////////////////////////////////////////////////////////////////////// 16 #include <boost/spirit/include/classic_core.hpp> 17 #include <iostream> 18 #include <string> 19 20 /////////////////////////////////////////////////////////////////////////////// 21 using namespace std; 22 using namespace BOOST_SPIRIT_CLASSIC_NS; 23 24 /////////////////////////////////////////////////////////////////////////////// 25 // 26 // Semantic actions 27 // 28 /////////////////////////////////////////////////////////////////////////////// 29 struct my_action 30 { 31 template <typename IteratorT> operator ()my_action32 void operator()(IteratorT first, IteratorT last) const 33 { 34 string s(first, last); 35 cout << "\tMy Action got: " << s << endl; 36 } 37 }; 38 39 /////////////////////////////////////////////////////////////////////////////// 40 // 41 // My grammar 42 // 43 /////////////////////////////////////////////////////////////////////////////// 44 struct my_grammar : public grammar<my_grammar> 45 { 46 template <typename ScannerT> 47 struct definition 48 { definitionmy_grammar::definition49 definition(my_grammar const& self) 50 { 51 my_rule = 52 *lexeme_d[(+graph_p)[my_action()]] 53 ; 54 } 55 56 rule<ScannerT> my_rule; 57 rule<ScannerT> const& startmy_grammar::definition58 start() const { return my_rule; } 59 }; 60 }; 61 62 /////////////////////////////////////////////////////////////////////////////// 63 // 64 // Main program 65 // 66 /////////////////////////////////////////////////////////////////////////////// 67 int main()68main() 69 { 70 cout << "/////////////////////////////////////////////////////////\n\n"; 71 cout << "\t\t A boiler-plate parser...\n\n"; 72 cout << "/////////////////////////////////////////////////////////\n\n"; 73 cout << "Type anything or [q or Q] to quit\n\n"; 74 75 my_grammar g; 76 77 string str; 78 while (getline(cin, str)) 79 { 80 if (str.empty() || str[0] == 'q' || str[0] == 'Q') 81 break; 82 83 if (parse(str.c_str(), g, space_p).full) 84 { 85 cout << "parsing succeeded\n"; 86 } 87 else 88 { 89 cout << "parsing failed\n"; 90 } 91 } 92 93 cout << "Bye... :-) \n\n"; 94 return 0; 95 } 96 97 98