123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- // Copyright (c) 2001-2011 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/detail/lightweight_test.hpp>
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/lex_lexertl.hpp>
- namespace lex = boost::spirit::lex;
- typedef lex::lexertl::token<std::string::iterator> token_type;
- typedef lex::lexertl::actor_lexer<token_type> lexer_type;
- ///////////////////////////////////////////////////////////////////////////////
- static bool found_identifier_flag = false;
- ///////////////////////////////////////////////////////////////////////////////
- void found_identifier_sa0()
- {
- found_identifier_flag = true;
- }
- template <typename Lexer>
- struct lexer_sa0 : lex::lexer<Lexer>
- {
- lexer_sa0()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa0];
- }
- lex::token_def<> identifier;
- };
- ///////////////////////////////////////////////////////////////////////////////
- static std::string found_identifier_str;
- void found_identifier_sa2(std::string::iterator& start
- , std::string::iterator& end)
- {
- found_identifier_flag = true;
- found_identifier_str = std::string(start, end);
- }
- template <typename Lexer>
- struct lexer_sa2 : lex::lexer<Lexer>
- {
- lexer_sa2()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa2];
- }
- lex::token_def<> identifier;
- };
- ///////////////////////////////////////////////////////////////////////////////
- void found_identifier_sa3_normal(std::string::iterator& start
- , std::string::iterator& end, BOOST_SCOPED_ENUM(lex::pass_flags)& pass)
- {
- BOOST_TEST(pass == lex::pass_flags::pass_normal);
- found_identifier_flag = true;
- found_identifier_str = std::string(start, end);
- }
- template <typename Lexer>
- struct lexer_sa3_normal : lex::lexer<Lexer>
- {
- lexer_sa3_normal()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa3_normal];
- }
- lex::token_def<> identifier;
- };
- void found_identifier_sa3_fail(std::string::iterator&, std::string::iterator&
- , BOOST_SCOPED_ENUM(lex::pass_flags)& pass)
- {
- pass = lex::pass_flags::pass_fail;
- }
- template <typename Lexer>
- struct lexer_sa3_fail : lex::lexer<Lexer>
- {
- lexer_sa3_fail()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa3_fail];
- }
- lex::token_def<> identifier;
- };
- void found_identifier_sa3_ignore(std::string::iterator&, std::string::iterator&
- , BOOST_SCOPED_ENUM(lex::pass_flags)& pass)
- {
- pass = lex::pass_flags::pass_ignore;
- }
- template <typename Lexer>
- struct lexer_sa3_ignore : lex::lexer<Lexer>
- {
- lexer_sa3_ignore()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa3_ignore];
- }
- lex::token_def<> identifier;
- };
- ///////////////////////////////////////////////////////////////////////////////
- static std::size_t found_identifier_id = 0;
- void found_identifier_sa4(std::string::iterator& start
- , std::string::iterator& end, BOOST_SCOPED_ENUM(lex::pass_flags)& pass
- , std::size_t id)
- {
- BOOST_TEST(pass == lex::pass_flags::pass_normal);
- found_identifier_flag = true;
- found_identifier_str = std::string(start, end);
- found_identifier_id = id;
- }
- template <typename Lexer>
- struct lexer_sa4 : lex::lexer<Lexer>
- {
- lexer_sa4()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa4];
- }
- lex::token_def<> identifier;
- };
- void found_identifier_sa4_id(std::string::iterator& start
- , std::string::iterator& end, BOOST_SCOPED_ENUM(lex::pass_flags)& pass
- , std::size_t& id)
- {
- BOOST_TEST(pass == lex::pass_flags::pass_normal);
- found_identifier_flag = true;
- found_identifier_str = std::string(start, end);
- found_identifier_id = id;
- id = 1;
- }
- template <typename Lexer>
- struct lexer_sa4_id : lex::lexer<Lexer>
- {
- lexer_sa4_id()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [&found_identifier_sa4_id];
- }
- lex::token_def<> identifier;
- };
- static std::size_t found_identifier_id2 = 0;
- bool identifier_token(token_type const& t)
- {
- found_identifier_id2 = t.id();
- return true;
- }
- ///////////////////////////////////////////////////////////////////////////////
- struct found_identifier_sa5
- {
- template <typename Context>
- void operator()(std::string::iterator& /*start*/
- , std::string::iterator& /*end*/, BOOST_SCOPED_ENUM(lex::pass_flags)& pass
- , std::size_t& /*id*/, Context& ctx)
- {
- BOOST_TEST(pass == lex::pass_flags::pass_normal);
- found_identifier_flag = true;
- found_identifier_str = std::string(ctx.get_value().begin(), ctx.get_value().end());
- }
- };
- template <typename Lexer>
- struct lexer_sa5 : lex::lexer<Lexer>
- {
- lexer_sa5()
- {
- identifier = "[a-zA-Z][_a-zA-Z0-9]*";
- this->self += identifier [found_identifier_sa5()];
- }
- lex::token_def<> identifier;
- };
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- std::string identifier ("id_1234");
- std::string::iterator first = identifier.begin();
- std::string::iterator last = identifier.end();
- // test semantic action taking no arguments
- found_identifier_flag = false;
- {
- lexer_sa0<lexer_type> sa0;
- BOOST_TEST(lex::tokenize(first, last, sa0));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- }
- // test semantic action taking two arguments (iterator pair for matched
- // sequence)
- found_identifier_flag = false;
- found_identifier_str.clear();
- first = identifier.begin();
- {
- lexer_sa2<lexer_type> sa2;
- BOOST_TEST(lex::tokenize(first, last, sa2));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- BOOST_TEST(found_identifier_str == identifier);
- }
- // test semantic action taking three arguments (iterator pair for matched
- // sequence and pass_flags) - pass_flags::pass_normal
- found_identifier_flag = false;
- found_identifier_str.clear();
- first = identifier.begin();
- {
- lexer_sa3_normal<lexer_type> sa3;
- BOOST_TEST(lex::tokenize(first, last, sa3));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- BOOST_TEST(found_identifier_str == identifier);
- }
- // test semantic action taking three arguments (iterator pair for matched
- // sequence and pass_flags) - pass_flags::pass_fail
- first = identifier.begin();
- {
- lexer_sa3_fail<lexer_type> sa3;
- BOOST_TEST(!lex::tokenize(first, last, sa3));
- BOOST_TEST(first != last);
- }
- // test semantic action taking three arguments (iterator pair for matched
- // sequence and pass_flags) - pass_flags::pass_ignore
- first = identifier.begin();
- {
- lexer_sa3_ignore<lexer_type> sa3;
- BOOST_TEST(lex::tokenize(first, last, sa3));
- BOOST_TEST(first == last);
- }
- // test semantic action taking four arguments (iterator pair for matched
- // sequence and pass_flags, and token id)
- found_identifier_flag = false;
- found_identifier_str.clear();
- first = identifier.begin();
- found_identifier_id = 0;
- {
- lexer_sa4<lexer_type> sa4;
- BOOST_TEST(lex::tokenize(first, last, sa4));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- BOOST_TEST(found_identifier_str == identifier);
- BOOST_TEST(found_identifier_id == lex::min_token_id);
- }
- found_identifier_flag = false;
- found_identifier_str.clear();
- first = identifier.begin();
- found_identifier_id = 0;
- found_identifier_id2 = 0;
- {
- lexer_sa4_id<lexer_type> sa4;
- BOOST_TEST(lex::tokenize(first, last, sa4, identifier_token));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- BOOST_TEST(found_identifier_str == identifier);
- BOOST_TEST(found_identifier_id == lex::min_token_id);
- BOOST_TEST(found_identifier_id2 == 1);
- }
- // test semantic action taking four arguments (iterator pair for matched
- // sequence and pass_flags, token id, and context)
- found_identifier_flag = false;
- found_identifier_str.clear();
- first = identifier.begin();
- found_identifier_id = 0;
- found_identifier_id2 = 0;
- {
- lexer_sa5<lexer_type> sa5;
- BOOST_TEST(lex::tokenize(first, last, sa5));
- BOOST_TEST(first == last);
- BOOST_TEST(found_identifier_flag);
- BOOST_TEST(found_identifier_str == identifier);
- }
- return boost::report_errors();
- }
|