| // Copyright (c) 2001-2010 Hartmut Kaiser |
| // |
| // 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 <boost/mpl/print.hpp> |
| #include <boost/detail/lightweight_test.hpp> |
| #include <boost/spirit/include/phoenix_object.hpp> |
| #include <boost/spirit/include/phoenix_operator.hpp> |
| #include <boost/spirit/include/phoenix_statement.hpp> |
| #include <boost/spirit/include/lex_lexertl.hpp> |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // Token definition |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename Lexer> |
| struct switch_state_tokens : boost::spirit::lex::lexer<Lexer> |
| { |
| // define tokens and associate them with the lexer |
| switch_state_tokens() |
| { |
| namespace phoenix = boost::phoenix; |
| using boost::spirit::lex::_state; |
| |
| identifier = "[a-zA-Z_][a-zA-Z0-9_]*"; |
| this->self = identifier [ phoenix::ref(state_) = _state ]; |
| |
| integer = "[0-9]+"; |
| this->self("INT") = integer [ _state = phoenix::val("INITIAL") ]; |
| } |
| |
| std::string state_; |
| boost::spirit::lex::token_def<> identifier, integer; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| int main() |
| { |
| using namespace boost::spirit; |
| using namespace boost::spirit::lex; |
| |
| typedef std::string::iterator base_iterator_type; |
| typedef boost::spirit::lex::lexertl::token<base_iterator_type> token_type; |
| typedef boost::spirit::lex::lexertl::actor_lexer<token_type> lexer_type; |
| |
| { |
| switch_state_tokens<lexer_type> lex; |
| |
| { |
| // verify whether using _state as an rvalue works |
| std::string input("abc123"); |
| base_iterator_type first = input.begin(); |
| BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), lex) && |
| lex.state_ == "INITIAL"); |
| } |
| { |
| // verify whether using _state as an lvalue works |
| std::string input("123abc123"); |
| base_iterator_type first = input.begin(); |
| BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), lex, "INT") && |
| lex.state_ == "INITIAL"); |
| } |
| } |
| |
| return boost::report_errors(); |
| } |
| |