• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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