// Copyright (c) 2009 Carl Barron // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include namespace lex = boost::spirit::lex; namespace phoenix = boost::phoenix; /////////////////////////////////////////////////////////////////////////////// struct square_impl { template struct result { typedef int type; }; template int operator () (const A &x) const { return (x) * (x); } }; phoenix::function const square = square_impl(); /////////////////////////////////////////////////////////////////////////////// template struct test_tokens : lex::lexer { test_tokens() { a = "a"; this->self = a [lex::_val = square(*lex::_start)]; } lex::token_def a; }; struct catch_result { template bool operator() (Token const& x) const { BOOST_TEST(x.value().which() == 1); BOOST_TEST(boost::get(x.value()) == 9409); // 9409 == 'a' * 'a' return true; } }; /////////////////////////////////////////////////////////////////////////////// int main() { typedef lex::lexertl::token > token_type; std::string in = "a"; std::string::iterator first(in.begin()); test_tokens > the_lexer; BOOST_TEST(lex::tokenize(first, in.end(), the_lexer, catch_result())); return boost::report_errors(); }