Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 1998-2003 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2003 Vaclav Vesely
|
Chris@16
|
4 http://spirit.sourceforge.net/
|
Chris@16
|
5
|
Chris@16
|
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 =============================================================================*/
|
Chris@16
|
9 #if !defined(BOOST_SPIRIT_DISTINCT_HPP)
|
Chris@16
|
10 #define BOOST_SPIRIT_DISTINCT_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/spirit/home/classic/core/parser.hpp>
|
Chris@16
|
13 #include <boost/spirit/home/classic/core/primitives/primitives.hpp>
|
Chris@16
|
14 #include <boost/spirit/home/classic/core/composite/operators.hpp>
|
Chris@16
|
15 #include <boost/spirit/home/classic/core/composite/directives.hpp>
|
Chris@16
|
16 #include <boost/spirit/home/classic/core/composite/epsilon.hpp>
|
Chris@16
|
17 #include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
|
Chris@16
|
18 #include <boost/spirit/home/classic/utility/chset.hpp>
|
Chris@16
|
19
|
Chris@16
|
20 #include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
|
Chris@16
|
21
|
Chris@16
|
22 namespace boost {
|
Chris@16
|
23 namespace spirit {
|
Chris@16
|
24 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
|
Chris@16
|
25
|
Chris@16
|
26 //-----------------------------------------------------------------------------
|
Chris@16
|
27 // distinct_parser class
|
Chris@16
|
28
|
Chris@16
|
29 template <typename CharT, typename TailT>
|
Chris@16
|
30 class distinct_parser
|
Chris@16
|
31 {
|
Chris@16
|
32 public:
|
Chris@16
|
33 typedef
|
Chris@16
|
34 contiguous<
|
Chris@16
|
35 sequence<
|
Chris@16
|
36 chseq<CharT const*>,
|
Chris@16
|
37 negated_empty_match_parser<
|
Chris@16
|
38 TailT
|
Chris@16
|
39 >
|
Chris@16
|
40 >
|
Chris@16
|
41 >
|
Chris@16
|
42 result_t;
|
Chris@16
|
43
|
Chris@16
|
44 distinct_parser()
|
Chris@16
|
45 : tail(chset<CharT>())
|
Chris@16
|
46 {
|
Chris@16
|
47 }
|
Chris@16
|
48
|
Chris@16
|
49 explicit distinct_parser(parser<TailT> const & tail_)
|
Chris@16
|
50 : tail(tail_.derived())
|
Chris@16
|
51 {
|
Chris@16
|
52 }
|
Chris@16
|
53
|
Chris@16
|
54 explicit distinct_parser(CharT const* letters)
|
Chris@16
|
55 : tail(chset_p(letters))
|
Chris@16
|
56 {
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 result_t operator()(CharT const* str) const
|
Chris@16
|
60 {
|
Chris@16
|
61 return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
|
Chris@16
|
62 }
|
Chris@16
|
63
|
Chris@16
|
64 TailT tail;
|
Chris@16
|
65 };
|
Chris@16
|
66
|
Chris@16
|
67 //-----------------------------------------------------------------------------
|
Chris@16
|
68 // distinct_directive class
|
Chris@16
|
69
|
Chris@16
|
70 template <typename CharT, typename TailT>
|
Chris@16
|
71 class distinct_directive
|
Chris@16
|
72 {
|
Chris@16
|
73 public:
|
Chris@16
|
74 template<typename ParserT>
|
Chris@16
|
75 struct result {
|
Chris@16
|
76 typedef
|
Chris@16
|
77 contiguous<
|
Chris@16
|
78 sequence<
|
Chris@16
|
79 ParserT,
|
Chris@16
|
80 negated_empty_match_parser<
|
Chris@16
|
81 TailT
|
Chris@16
|
82 >
|
Chris@16
|
83 >
|
Chris@16
|
84 >
|
Chris@16
|
85 type;
|
Chris@16
|
86 };
|
Chris@16
|
87
|
Chris@16
|
88 distinct_directive()
|
Chris@16
|
89 : tail(chset<CharT>())
|
Chris@16
|
90 {
|
Chris@16
|
91 }
|
Chris@16
|
92
|
Chris@16
|
93 explicit distinct_directive(CharT const* letters)
|
Chris@16
|
94 : tail(chset_p(letters))
|
Chris@16
|
95 {
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 explicit distinct_directive(parser<TailT> const & tail_)
|
Chris@16
|
99 : tail(tail_.derived())
|
Chris@16
|
100 {
|
Chris@16
|
101 }
|
Chris@16
|
102
|
Chris@16
|
103 template<typename ParserT>
|
Chris@16
|
104 typename result<typename as_parser<ParserT>::type>::type
|
Chris@16
|
105 operator[](ParserT const &subject) const
|
Chris@16
|
106 {
|
Chris@16
|
107 return
|
Chris@16
|
108 lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
|
Chris@16
|
109 }
|
Chris@16
|
110
|
Chris@16
|
111 TailT tail;
|
Chris@16
|
112 };
|
Chris@16
|
113
|
Chris@16
|
114 //-----------------------------------------------------------------------------
|
Chris@16
|
115 // dynamic_distinct_parser class
|
Chris@16
|
116
|
Chris@16
|
117 template <typename ScannerT>
|
Chris@16
|
118 class dynamic_distinct_parser
|
Chris@16
|
119 {
|
Chris@16
|
120 public:
|
Chris@16
|
121 typedef typename ScannerT::value_t char_t;
|
Chris@16
|
122
|
Chris@16
|
123 typedef
|
Chris@16
|
124 rule<
|
Chris@16
|
125 typename no_actions_scanner<
|
Chris@16
|
126 typename lexeme_scanner<ScannerT>::type
|
Chris@16
|
127 >::type
|
Chris@16
|
128 >
|
Chris@16
|
129 tail_t;
|
Chris@16
|
130
|
Chris@16
|
131 typedef
|
Chris@16
|
132 contiguous<
|
Chris@16
|
133 sequence<
|
Chris@16
|
134 chseq<char_t const*>,
|
Chris@16
|
135 negated_empty_match_parser<
|
Chris@16
|
136 tail_t
|
Chris@16
|
137 >
|
Chris@16
|
138 >
|
Chris@16
|
139 >
|
Chris@16
|
140 result_t;
|
Chris@16
|
141
|
Chris@16
|
142 dynamic_distinct_parser()
|
Chris@16
|
143 : tail(nothing_p)
|
Chris@16
|
144 {
|
Chris@16
|
145 }
|
Chris@16
|
146
|
Chris@16
|
147 template<typename ParserT>
|
Chris@16
|
148 explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
|
Chris@16
|
149 : tail(tail_.derived())
|
Chris@16
|
150 {
|
Chris@16
|
151 }
|
Chris@16
|
152
|
Chris@16
|
153 explicit dynamic_distinct_parser(char_t const* letters)
|
Chris@16
|
154 : tail(chset_p(letters))
|
Chris@16
|
155 {
|
Chris@16
|
156 }
|
Chris@16
|
157
|
Chris@16
|
158 result_t operator()(char_t const* str) const
|
Chris@16
|
159 {
|
Chris@16
|
160 return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
|
Chris@16
|
161 }
|
Chris@16
|
162
|
Chris@16
|
163 tail_t tail;
|
Chris@16
|
164 };
|
Chris@16
|
165
|
Chris@16
|
166 //-----------------------------------------------------------------------------
|
Chris@16
|
167 // dynamic_distinct_directive class
|
Chris@16
|
168
|
Chris@16
|
169 template <typename ScannerT>
|
Chris@16
|
170 class dynamic_distinct_directive
|
Chris@16
|
171 {
|
Chris@16
|
172 public:
|
Chris@16
|
173 typedef typename ScannerT::value_t char_t;
|
Chris@16
|
174
|
Chris@16
|
175 typedef
|
Chris@16
|
176 rule<
|
Chris@16
|
177 typename no_actions_scanner<
|
Chris@16
|
178 typename lexeme_scanner<ScannerT>::type
|
Chris@16
|
179 >::type
|
Chris@16
|
180 >
|
Chris@16
|
181 tail_t;
|
Chris@16
|
182
|
Chris@16
|
183 template<typename ParserT>
|
Chris@16
|
184 struct result {
|
Chris@16
|
185 typedef
|
Chris@16
|
186 contiguous<
|
Chris@16
|
187 sequence<
|
Chris@16
|
188 ParserT,
|
Chris@16
|
189 negated_empty_match_parser<
|
Chris@16
|
190 tail_t
|
Chris@16
|
191 >
|
Chris@16
|
192 >
|
Chris@16
|
193 >
|
Chris@16
|
194 type;
|
Chris@16
|
195 };
|
Chris@16
|
196
|
Chris@16
|
197 dynamic_distinct_directive()
|
Chris@16
|
198 : tail(nothing_p)
|
Chris@16
|
199 {
|
Chris@16
|
200 }
|
Chris@16
|
201
|
Chris@16
|
202 template<typename ParserT>
|
Chris@16
|
203 explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
|
Chris@16
|
204 : tail(tail_.derived())
|
Chris@16
|
205 {
|
Chris@16
|
206 }
|
Chris@16
|
207
|
Chris@16
|
208 explicit dynamic_distinct_directive(char_t const* letters)
|
Chris@16
|
209 : tail(chset_p(letters))
|
Chris@16
|
210 {
|
Chris@16
|
211 }
|
Chris@16
|
212
|
Chris@16
|
213 template<typename ParserT>
|
Chris@16
|
214 typename result<typename as_parser<ParserT>::type>::type
|
Chris@16
|
215 operator[](ParserT const &subject) const
|
Chris@16
|
216 {
|
Chris@16
|
217 return
|
Chris@16
|
218 lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
|
Chris@16
|
219 }
|
Chris@16
|
220
|
Chris@16
|
221 tail_t tail;
|
Chris@16
|
222 };
|
Chris@16
|
223
|
Chris@16
|
224 //-----------------------------------------------------------------------------
|
Chris@16
|
225 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
Chris@16
|
226 } // namespace spirit
|
Chris@16
|
227 } // namespace boost
|
Chris@16
|
228
|
Chris@16
|
229 #endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)
|