1 // Copyright (c) 2009 Carl Barron 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include <string> 7 #include <iostream> 8 9 #include <boost/detail/lightweight_test.hpp> 10 #include <boost/spirit/include/lex.hpp> 11 #include <boost/spirit/include/lex_lexertl.hpp> 12 #include <boost/spirit/include/phoenix_core.hpp> 13 #include <boost/spirit/include/phoenix_function.hpp> 14 #include <boost/phoenix/operator/self.hpp> 15 16 namespace lex = boost::spirit::lex; 17 namespace phoenix = boost::phoenix; 18 19 /////////////////////////////////////////////////////////////////////////////// 20 struct square_impl 21 { 22 template <class> 23 struct result { typedef int type; }; 24 25 template <class A> operator ()square_impl26 int operator () (const A &x) const 27 { return (x) * (x); } 28 }; 29 30 phoenix::function<square_impl> const square = square_impl(); 31 32 /////////////////////////////////////////////////////////////////////////////// 33 template <class Lexer> 34 struct test_tokens : lex::lexer<Lexer> 35 { test_tokenstest_tokens36 test_tokens() 37 { 38 a = "a"; 39 this->self = a [lex::_val = square(*lex::_start)]; 40 } 41 42 lex::token_def<int> a; 43 }; 44 45 struct catch_result 46 { 47 template <class Token> operator ()catch_result48 bool operator() (Token const& x) const 49 { 50 BOOST_TEST(x.value().which() == 1); 51 BOOST_TEST(boost::get<int>(x.value()) == 9409); // 9409 == 'a' * 'a' 52 return true; 53 } 54 }; 55 56 /////////////////////////////////////////////////////////////////////////////// main()57int main() 58 { 59 typedef lex::lexertl::token<std::string::iterator 60 , boost::mpl::vector<int> > token_type; 61 62 std::string in = "a"; 63 std::string::iterator first(in.begin()); 64 65 test_tokens<lex::lexertl::actor_lexer<token_type> > the_lexer; 66 BOOST_TEST(lex::tokenize(first, in.end(), the_lexer, catch_result())); 67 68 return boost::report_errors(); 69 } 70