1 /*============================================================================= 2 Boost.Wave: A Standard compliant C++ preprocessor library 3 http://www.boost.org/ 4 5 Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost 6 Software License, Version 1.0. (See accompanying file 7 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 =============================================================================*/ 9 10 // system headers 11 #include <string> 12 #include <limits> 13 #if defined(TESTLEXERS_TIMING) 14 #include <iostream> 15 #endif 16 17 #include <boost/wave/wave_config.hpp> 18 #undef BOOST_WAVE_SEPARATE_LEXER_INSTANTIATION 19 20 #include <boost/detail/lightweight_test.hpp> 21 #if defined(TESTLEXERS_TIMING) 22 #include "high_resolution_timer.hpp" 23 #endif 24 25 // include the lexertl lexer related stuff 26 #include <boost/wave/cpplexer/cpp_lex_token.hpp> // token type 27 #include <libs/wave/samples/list_includes/lexertl/lexertl_lexer.hpp> // lexer type 28 29 typedef boost::wave::cpplexer::lex_token<> token_type; 30 typedef boost::wave::cpplexer::lexertl::lex_iterator<token_type> lexer_type; 31 32 /////////////////////////////////////////////////////////////////////////////// 33 // include test data 34 #include "cpp_tokens.hpp" 35 36 /////////////////////////////////////////////////////////////////////////////// 37 int main(int argc,char * argv[])38main(int argc, char *argv[]) 39 { 40 try { 41 token_type::position_type pos("<testdata>"); 42 43 #if defined(TESTLEXERS_TIMING) 44 boost::high_resolution_timer tim; 45 for (int i = 0; i < 1000; ++i) { 46 #endif 47 48 for (lexem const* data = lexems; NULL != data->token; ++data) { 49 // feed the token to the lexer 50 token_type::string_type instr(data->token); 51 52 lexer_type it = lexer_type(instr.begin(), instr.end(), pos, 53 boost::wave::support_option_long_long); 54 lexer_type end = lexer_type(); 55 56 // verify the correct outcome of the tokenization 57 #if defined(TESTLEXERS_VERBOSE) 58 std::cerr << boost::wave::get_token_name(data->id) << std::endl; 59 #endif 60 61 if (data->id != boost::wave::token_id(*it)) { 62 BOOST_TEST(data->id == boost::wave::token_id(*it)); 63 std::cerr << data->token << ": expected: " 64 << boost::wave::get_token_name(data->id); 65 std::cerr << ", found: " 66 << boost::wave::get_token_name(boost::wave::token_id(*it)) 67 << std::endl; 68 } 69 BOOST_TEST(++it != end); 70 if (boost::wave::T_EOF != boost::wave::token_id(*it)) { 71 BOOST_TEST(boost::wave::T_EOF == boost::wave::token_id(*it)); 72 std::cerr << data->token << ": not fully matched, " 73 << "first non-matched token was: " << (*it).get_value() 74 << std::endl; 75 } 76 } 77 78 #if defined(TESTLEXERS_TIMING) 79 } 80 std::cout << tim.elapsed() << " [s]" << std::endl; 81 #endif 82 } 83 catch (boost::wave::cpplexer::lexing_exception &e) { 84 // some lexing error 85 std::cerr 86 << "test_lexertl_lexer: " 87 << e.description() << std::endl; 88 return (std::numeric_limits<int>::max)() - 1; 89 } 90 91 return boost::report_errors(); 92 } 93 94