1 /*============================================================================= 2 Boost.Wave: A Standard compliant C++ preprocessor library 3 4 Definition of the abstract lexer interface 5 6 http://www.boost.org/ 7 8 Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost 9 Software License, Version 1.0. (See accompanying file 10 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 11 =============================================================================*/ 12 13 #if !defined(BOOST_WAVE_LEX_INTERFACE_GENERATOR_HPP_INCLUDED) 14 #define BOOST_WAVE_LEX_INTERFACE_GENERATOR_HPP_INCLUDED 15 16 #include <boost/wave/wave_config.hpp> 17 #include <boost/wave/util/file_position.hpp> 18 #include <boost/wave/language_support.hpp> 19 #include <boost/wave/cpplexer/cpp_lex_interface.hpp> 20 #include <boost/wave/cpplexer/cpp_lex_token.hpp> // lex_token 21 22 // this must occur after all of the includes and before any code appears 23 #ifdef BOOST_HAS_ABI_HEADERS 24 #include BOOST_ABI_PREFIX 25 #endif 26 27 // suppress warnings about dependent classes not being exported from the dll 28 #ifdef BOOST_MSVC 29 #pragma warning(push) 30 #pragma warning(disable : 4251 4231 4660) 31 #endif 32 33 /////////////////////////////////////////////////////////////////////////////// 34 namespace boost { 35 namespace wave { 36 namespace cpplexer { 37 38 #if BOOST_WAVE_SEPARATE_LEXER_INSTANTIATION != 0 39 #define BOOST_WAVE_NEW_LEXER_DECL BOOST_WAVE_DECL 40 #else 41 #define BOOST_WAVE_NEW_LEXER_DECL 42 #endif 43 44 /////////////////////////////////////////////////////////////////////////////// 45 // 46 // new_lexer_gen: generates a new instance of the required C++ lexer 47 // 48 /////////////////////////////////////////////////////////////////////////////// 49 template < 50 typename IteratorT, 51 typename PositionT = boost::wave::util::file_position_type, 52 typename TokenT = lex_token<PositionT> 53 > 54 struct BOOST_WAVE_NEW_LEXER_DECL new_lexer_gen 55 { 56 // The NewLexer function allows the opaque generation of a new lexer object. 57 // It is coupled to the token type to allow to decouple the lexer/token 58 // configurations at compile time. 59 static lex_input_interface<TokenT> * 60 new_lexer(IteratorT const &first, IteratorT const &last, 61 PositionT const &pos, boost::wave::language_support language); 62 }; 63 64 #undef BOOST_WAVE_NEW_LEXER_DECL 65 66 /////////////////////////////////////////////////////////////////////////////// 67 // 68 // The lex_input_interface_generator helps to instantiate a concrete lexer 69 // to be used by the Wave preprocessor module. 70 // This is done to allow compile time reduction. 71 // 72 /////////////////////////////////////////////////////////////////////////////// 73 74 template <typename TokenT> 75 struct lex_input_interface_generator 76 : lex_input_interface<TokenT> 77 { 78 typedef typename lex_input_interface<TokenT>::position_type position_type; 79 lex_input_interface_generatorboost::wave::cpplexer::lex_input_interface_generator80 lex_input_interface_generator() {} ~lex_input_interface_generatorboost::wave::cpplexer::lex_input_interface_generator81 ~lex_input_interface_generator() {} 82 83 // The new_lexer function allows the opaque generation of a new lexer object. 84 // It is coupled to the token type to allow to distinguish different 85 // lexer/token configurations at compile time. 86 template <typename IteratorT> 87 static lex_input_interface<TokenT> * new_lexerboost::wave::cpplexer::lex_input_interface_generator88 new_lexer(IteratorT const &first, IteratorT const &last, 89 position_type const &pos, boost::wave::language_support language) 90 { 91 return new_lexer_gen<IteratorT, position_type, TokenT>::new_lexer ( 92 first, last, pos, language); 93 } 94 }; 95 96 /////////////////////////////////////////////////////////////////////////////// 97 } // namespace cpplexer 98 } // namespace wave 99 } // namespace boost 100 101 #ifdef BOOST_MSVC 102 #pragma warning(pop) 103 #endif 104 105 // the suffix header occurs after all of the code 106 #ifdef BOOST_HAS_ABI_HEADERS 107 #include BOOST_ABI_SUFFIX 108 #endif 109 110 #endif // !defined(BOOST_WAVE_LEX_INTERFACE_GENERATOR_HPP_INCLUDED) 111