]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | // disable stupid compiler warnings | |
11 | #include <boost/config/warning_disable.hpp> | |
12 | ||
13 | // system headers | |
14 | #include <string> | |
20effc67 | 15 | #if defined(TESTLEXERS_TIMING) |
7c673cae | 16 | #include <iostream> |
20effc67 | 17 | #endif |
7c673cae FG |
18 | #include <limits> |
19 | ||
20 | #include <boost/wave/wave_config.hpp> | |
21 | #include <boost/detail/lightweight_test.hpp> | |
22 | #if defined(TESTLEXERS_TIMING) | |
23 | #include "high_resolution_timer.hpp" | |
24 | #endif | |
25 | ||
26 | /////////////////////////////////////////////////////////////////////////////// | |
27 | // include the Xpressive lexer related stuff | |
28 | #include <boost/wave/cpplexer/cpp_lex_token.hpp> // token type | |
29 | #include <libs/wave/samples/token_statistics/xlex/xlex_lexer.hpp> // lexer type | |
20effc67 | 30 | #include <libs/wave/samples/token_statistics/xlex_iterator.hpp> // iterator |
7c673cae FG |
31 | |
32 | typedef boost::wave::cpplexer::lex_token<> token_type; | |
33 | typedef boost::wave::cpplexer::xlex::xlex_iterator<token_type> lexer_type; | |
34 | ||
35 | // This instantiates the correct 'new_lexer' function, which generates the | |
36 | // C++ lexer used in this test. | |
37 | template struct boost::wave::cpplexer::xlex::new_lexer_gen<std::string::iterator>; | |
38 | ||
39 | /////////////////////////////////////////////////////////////////////////////// | |
40 | // include test data | |
41 | #include "cpp_tokens.hpp" | |
42 | ||
43 | /////////////////////////////////////////////////////////////////////////////// | |
44 | int | |
45 | main(int argc, char *argv[]) | |
46 | { | |
47 | try { | |
48 | token_type::position_type pos("<testdata>"); | |
49 | ||
50 | #if defined(TESTLEXERS_TIMING) | |
51 | boost::high_resolution_timer tim; | |
52 | for (int i = 0; i < 10; ++i) { | |
53 | #endif | |
54 | ||
55 | for (lexem const* data = lexems; NULL != data->token; ++data) { | |
56 | // feed the token to the lexer | |
57 | token_type::string_type instr(data->token); | |
58 | ||
59 | lexer_type it = lexer_type(instr.begin(), instr.end(), pos, | |
20effc67 | 60 | boost::wave::support_cpp2a); |
7c673cae FG |
61 | lexer_type end = lexer_type(); |
62 | ||
63 | // verify the correct outcome of the tokenisation | |
64 | #if defined(TESTLEXERS_VERBOSE) | |
65 | std::cerr << boost::wave::get_token_name(data->id) << std::endl; | |
66 | #endif | |
67 | ||
68 | if (data->id != boost::wave::token_id(*it)) { | |
69 | BOOST_TEST(data->id == boost::wave::token_id(*it)); | |
70 | std::cerr << data->token << ": expected: " | |
71 | << boost::wave::get_token_name(data->id); | |
72 | std::cerr << ", found: " | |
73 | << boost::wave::get_token_name(boost::wave::token_id(*it)) | |
74 | << std::endl; | |
75 | } | |
76 | BOOST_TEST(++it != end); | |
77 | BOOST_TEST(boost::wave::T_EOF == boost::wave::token_id(*it)); | |
78 | } | |
79 | ||
80 | #if defined(TESTLEXERS_TIMING) | |
81 | } | |
82 | std::cout << tim.elapsed() << " [s]" << std::endl; | |
83 | #endif | |
84 | } | |
85 | catch (boost::wave::cpplexer::lexing_exception &e) { | |
86 | // some lexing error | |
87 | std::cerr | |
88 | << "test_xlex_lexer: " | |
89 | << e.description() << std::endl; | |
90 | return (std::numeric_limits<int>::max)() - 1; | |
91 | } | |
92 | ||
93 | return boost::report_errors(); | |
94 | } |