1// Copyright (c) 2001-2011 Hartmut Kaiser
2// Copyright (c) 2001-2011 Joel de Guzman
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(BOOST_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM)
8#define BOOST_SPIRIT_LEX_META_COMPILER_APR_20_2009_0756PM
9
10#if defined(_MSC_VER)
11#pragma once
12#endif
13
14#include <boost/spirit/home/support/meta_compiler.hpp>
15#include <boost/spirit/home/lex/domain.hpp>
16#include <boost/spirit/home/lex/lexer_type.hpp>
17#include <boost/proto/tags.hpp>
18#include <boost/type_traits/remove_reference.hpp>
19#include <boost/utility/enable_if.hpp>
20
21namespace boost { namespace spirit
22{
23 template <typename T>
24 struct use_terminal<lex::domain, T
25 , typename enable_if<traits::is_lexer<T> >::type> // enables lexers
26 : mpl::true_ {};
27
28 namespace lex
29 {
30 template <typename T, typename Modifiers, typename Enable = void>
31 struct make_primitive // by default, return it as-is
32 {
33 typedef T result_type;
34
35 template <typename T_>
36 T_& operator()(T_& val, unused_type) const
37 {
38 return val;
39 }
40
41 template <typename T_>
42 T_ const& operator()(T_ const& val, unused_type) const
43 {
44 return val;
45 }
46 };
47
48 template <typename Tag, typename Elements
49 , typename Modifiers, typename Enable = void>
50 struct make_composite;
51 }
52
53 // Lex primitive meta-compiler
54 template <>
55 struct make_component<lex::domain, proto::tag::terminal>
56 {
57 template <typename Sig>
58 struct result;
59
60 template <typename This, typename Elements, typename Modifiers>
61 struct result<This(Elements, Modifiers)>
62 {
63 typedef typename lex::make_primitive<
64 typename remove_const<typename Elements::car_type>::type,
65 typename remove_reference<Modifiers>::type>::result_type
66 type;
67 };
68
69 template <typename Elements, typename Modifiers>
70 typename result<make_component(Elements, Modifiers)>::type
71 operator()(Elements const& elements, Modifiers const& modifiers) const
72 {
73 typedef typename remove_const<typename Elements::car_type>::type term;
74 return lex::make_primitive<term, Modifiers>()(elements.car, modifiers);
75 }
76 };
77
78 // Lex composite meta-compiler
79 template <typename Tag>
80 struct make_component<lex::domain, Tag>
81 {
82 template <typename Sig>
83 struct result;
84
85 template <typename This, typename Elements, typename Modifiers>
86 struct result<This(Elements, Modifiers)>
87 {
88 typedef typename
89 lex::make_composite<Tag, Elements
90 , typename remove_reference<Modifiers>::type>::result_type
91 type;
92 };
93
94 template <typename Elements, typename Modifiers>
95 typename result<make_component(Elements, Modifiers)>::type
96 operator()(Elements const& elements, Modifiers const& modifiers) const
97 {
98 return lex::make_composite<Tag, Elements, Modifiers>()(
99 elements, modifiers);
100 }
101 };
102
103}}
104
105#endif
106

source code of boost/libs/spirit/include/boost/spirit/home/lex/meta_compiler.hpp