• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2   Copyright (c) 2001-2011 Joel de Guzman
3   http://spirit.sourceforge.net/
4 
5   Distributed under the Boost Software License, Version 1.0. (See accompanying
6   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #ifndef BOOST_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM
9 #define BOOST_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM
10 
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14 
15 #include <boost/spirit/home/support/terminal.hpp>
16 #include <boost/spirit/home/support/char_encoding/standard.hpp>
17 #include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
18 #include <boost/spirit/home/support/char_encoding/ascii.hpp>
19 #include <boost/spirit/home/support/char_encoding/iso8859_1.hpp>
20 #include <boost/spirit/home/support/char_class.hpp>
21 #include <boost/mpl/vector.hpp>
22 #include <boost/proto/traits.hpp>
23 
24 #if defined(BOOST_SPIRIT_UNICODE)
25 # include <boost/spirit/home/support/char_encoding/unicode.hpp>
26 #endif
27 
28 namespace boost { namespace spirit
29 {
30     typedef mpl::vector<
31             spirit::char_encoding::ascii
32           , spirit::char_encoding::iso8859_1
33           , spirit::char_encoding::standard
34           , spirit::char_encoding::standard_wide
35 #if defined(BOOST_SPIRIT_UNICODE)
36           , spirit::char_encoding::unicode
37 #endif
38         >
39     char_encodings;
40 
41     template <typename T>
42     struct is_char_encoding : mpl::false_ {};
43 
44     template <>
45     struct is_char_encoding<spirit::char_encoding::ascii> : mpl::true_ {};
46 
47     template <>
48     struct is_char_encoding<spirit::char_encoding::iso8859_1> : mpl::true_ {};
49 
50     template <>
51     struct is_char_encoding<spirit::char_encoding::standard> : mpl::true_ {};
52 
53     template <>
54     struct is_char_encoding<spirit::char_encoding::standard_wide> : mpl::true_ {};
55 
56 #if defined(BOOST_SPIRIT_UNICODE)
57     template <>
58     struct is_char_encoding<spirit::char_encoding::unicode> : mpl::true_ {};
59 #endif
60 
61     template <typename Encoding>
62     struct encoding
63         : proto::terminal<tag::char_code<tag::encoding, Encoding> >::type
64     {};
65 
66     // Our basic terminals
67     BOOST_SPIRIT_DEFINE_TERMINALS_NAME(
68         ( verbatim, verbatim_type )
69         ( no_delimit, no_delimit_type )
70         ( lexeme, lexeme_type )
71         ( no_skip, no_skip_type )
72         ( omit, omit_type )
73         ( raw, raw_type )
74         ( as_string, as_string_type )
75         ( as_wstring, as_wstring_type )
76         ( inf, inf_type )
77         ( eol, eol_type )
78         ( eoi, eoi_type )
79         ( buffer, buffer_type )
80         ( true_, true_type )
81         ( false_, false_type )
82         ( matches, matches_type )
83         ( hold, hold_type )
84         ( strict, strict_type )
85         ( relaxed, relaxed_type )
86         ( duplicate, duplicate_type )
87         ( expect, expect_type )
88     )
89 
90     // Our extended terminals
91     BOOST_SPIRIT_DEFINE_TERMINALS_NAME_EX(
92         ( lit, lit_type )
93         ( bin, bin_type )
94         ( oct, oct_type )
95         ( hex, hex_type )
96         ( bool_, bool_type )
97         ( ushort_, ushort_type )
98         ( ulong_, ulong_type )
99         ( uint_, uint_type )
100         ( short_, short_type )
101         ( long_, long_type )
102         ( int_, int_type )
103         ( ulong_long, ulong_long_type )
104         ( long_long, long_long_type )
105         ( float_, float_type )
106         ( double_, double_type )
107         ( long_double, long_double_type )
108         ( repeat, repeat_type )
109         ( eps, eps_type )
110         ( pad, pad_type )
111         ( byte_, byte_type )
112         ( word, word_type )
113         ( big_word, big_word_type )
114         ( little_word, little_word_type )
115         ( dword, dword_type )
116         ( big_dword, big_dword_type )
117         ( little_dword, little_dword_type )
118         ( qword, qword_type )
119         ( big_qword, big_qword_type )
120         ( little_qword, little_qword_type )
121         ( bin_float, bin_float_type )
122         ( big_bin_float, big_bin_float_type )
123         ( little_bin_float, little_bin_float_type )
124         ( bin_double, bin_double_type )
125         ( big_bin_double, big_bin_double_type )
126         ( little_bin_double, little_bin_double_type )
127         ( skip, skip_type )
128         ( delimit, delimit_type )
129         ( stream, stream_type )
130         ( wstream, wstream_type )
131         ( left_align, left_align_type )
132         ( right_align, right_align_type )
133         ( center, center_type )
134         ( maxwidth, maxwidth_type )
135         ( set_state, set_state_type )
136         ( in_state, in_state_type )
137         ( token, token_type )
138         ( tokenid, tokenid_type )
139         ( raw_token, raw_token_type )
140         ( tokenid_mask, tokenid_mask_type )
141         ( attr, attr_type )
142         ( columns, columns_type )
143         ( auto_, auto_type )
144     )
145 
146     // special tags (used mainly for stateful tag types)
147     namespace tag
148     {
149         struct attr_cast { BOOST_SPIRIT_IS_TAG() };
150         struct as { BOOST_SPIRIT_IS_TAG() };
151     }
152 }}
153 
154 ///////////////////////////////////////////////////////////////////////////////
155 // Here we place the character-set sensitive placeholders. We have one set
156 // each for ascii, iso8859_1, standard and standard_wide and unicode. These
157 // placeholders are placed in its char-set namespace. For example, there exist
158 // a placeholder spirit::ascii::alnum for ascii versions of alnum.
159 
160 #define BOOST_SPIRIT_TAG_CHAR_SPEC(charset)                                     \
161     typedef tag::char_code<tag::char_, charset> char_;                          \
162     typedef tag::char_code<tag::string, charset> string;                        \
163     /***/
164 
165 #ifdef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
166 
167 #define BOOST_SPIRIT_CHAR_SPEC(charset)                                         \
168     typedef spirit::terminal<tag::charset::char_> char_type;                    \
169     typedef spirit::terminal<tag::charset::string> string_type;                 \
170     /***/
171 
172 #else
173 
174 #define BOOST_SPIRIT_CHAR_SPEC(charset)                                         \
175     typedef spirit::terminal<tag::charset::char_> char_type;                    \
176     char_type const char_ = char_type();                                        \
177                                                                                 \
178     inline void silence_unused_warnings_##char_() { (void) char_; }             \
179                                                                                 \
180     typedef spirit::terminal<tag::charset::string> string_type;                 \
181     string_type const string = string_type();                                   \
182                                                                                 \
183     inline void silence_unused_warnings_##string() { (void) string; }           \
184     /***/
185 
186 #endif
187 
188 #ifdef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
189 
190 #define BOOST_SPIRIT_CHAR_CODE(name, charset)                                   \
191     typedef proto::terminal<tag::char_code<tag::name, charset> >::type          \
192         name##_type;                                                            \
193     /***/
194 
195 #else
196 
197 #define BOOST_SPIRIT_CHAR_CODE(name, charset)                                   \
198     typedef proto::terminal<tag::char_code<tag::name, charset> >::type          \
199         name##_type;                                                            \
200     name##_type const name = name##_type();                                     \
201                                                                                 \
202     inline void silence_unused_warnings_##name() { (void) name; }               \
203     /***/
204 
205 
206 #endif
207 
208 #define BOOST_SPIRIT_DEFINE_CHAR_CODES(charset)                                 \
209     namespace boost { namespace spirit { namespace tag { namespace charset      \
210     {                                                                           \
211         BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::charset)              \
212     }}}}                                                                        \
213     namespace boost { namespace spirit { namespace charset                      \
214     {                                                                           \
215         BOOST_SPIRIT_CHAR_SPEC(charset)                                         \
216                                                                                 \
217         BOOST_SPIRIT_CHAR_CODE(alnum, spirit::char_encoding::charset)           \
218         BOOST_SPIRIT_CHAR_CODE(alpha, spirit::char_encoding::charset)           \
219         BOOST_SPIRIT_CHAR_CODE(blank, spirit::char_encoding::charset)           \
220         BOOST_SPIRIT_CHAR_CODE(cntrl, spirit::char_encoding::charset)           \
221         BOOST_SPIRIT_CHAR_CODE(digit, spirit::char_encoding::charset)           \
222         BOOST_SPIRIT_CHAR_CODE(graph, spirit::char_encoding::charset)           \
223         BOOST_SPIRIT_CHAR_CODE(print, spirit::char_encoding::charset)           \
224         BOOST_SPIRIT_CHAR_CODE(punct, spirit::char_encoding::charset)           \
225         BOOST_SPIRIT_CHAR_CODE(space, spirit::char_encoding::charset)           \
226         BOOST_SPIRIT_CHAR_CODE(xdigit, spirit::char_encoding::charset)          \
227                                                                                 \
228         BOOST_SPIRIT_CHAR_CODE(no_case, spirit::char_encoding::charset)         \
229         BOOST_SPIRIT_CHAR_CODE(lower, spirit::char_encoding::charset)           \
230         BOOST_SPIRIT_CHAR_CODE(upper, spirit::char_encoding::charset)           \
231         BOOST_SPIRIT_CHAR_CODE(lowernum, spirit::char_encoding::charset)        \
232         BOOST_SPIRIT_CHAR_CODE(uppernum, spirit::char_encoding::charset)        \
233     }}}                                                                         \
234     /***/
235 
236 BOOST_SPIRIT_DEFINE_CHAR_CODES(ascii)
237 BOOST_SPIRIT_DEFINE_CHAR_CODES(iso8859_1)
238 BOOST_SPIRIT_DEFINE_CHAR_CODES(standard)
239 BOOST_SPIRIT_DEFINE_CHAR_CODES(standard_wide)
240 
241 namespace boost { namespace spirit { namespace traits
242 {
243     template <typename Char>
244     struct char_encoding_from_char;
245 
246     template <>
247     struct char_encoding_from_char<char>
248       : mpl::identity<spirit::char_encoding::standard>
249     {};
250 
251     template <>
252     struct char_encoding_from_char<wchar_t>
253       : mpl::identity<spirit::char_encoding::standard_wide>
254     {};
255 
256     template <typename T>
257     struct char_encoding_from_char<T const>
258       : char_encoding_from_char<T>
259     {};
260 }}}
261 
262 #if defined(BOOST_SPIRIT_UNICODE)
263 BOOST_SPIRIT_DEFINE_CHAR_CODES(unicode)
264 
265     namespace boost { namespace spirit { namespace tag { namespace unicode
266     {
267         BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::unicode)
268     }}}}
269 
270     namespace boost { namespace spirit { namespace unicode
271     {
272 #define BOOST_SPIRIT_UNICODE_CHAR_CODE(name)                                    \
273     BOOST_SPIRIT_CHAR_CODE(name, spirit::char_encoding::unicode)                \
274 
275     ///////////////////////////////////////////////////////////////////////////
276     //  Unicode Major Categories
277     ///////////////////////////////////////////////////////////////////////////
278         BOOST_SPIRIT_UNICODE_CHAR_CODE(letter)
279         BOOST_SPIRIT_UNICODE_CHAR_CODE(mark)
280         BOOST_SPIRIT_UNICODE_CHAR_CODE(number)
281         BOOST_SPIRIT_UNICODE_CHAR_CODE(separator)
282         BOOST_SPIRIT_UNICODE_CHAR_CODE(other)
283         BOOST_SPIRIT_UNICODE_CHAR_CODE(punctuation)
284         BOOST_SPIRIT_UNICODE_CHAR_CODE(symbol)
285 
286     ///////////////////////////////////////////////////////////////////////////
287     //  Unicode General Categories
288     ///////////////////////////////////////////////////////////////////////////
289         BOOST_SPIRIT_UNICODE_CHAR_CODE(uppercase_letter)
290         BOOST_SPIRIT_UNICODE_CHAR_CODE(lowercase_letter)
291         BOOST_SPIRIT_UNICODE_CHAR_CODE(titlecase_letter)
292         BOOST_SPIRIT_UNICODE_CHAR_CODE(modifier_letter)
293         BOOST_SPIRIT_UNICODE_CHAR_CODE(other_letter)
294 
295         BOOST_SPIRIT_UNICODE_CHAR_CODE(nonspacing_mark)
296         BOOST_SPIRIT_UNICODE_CHAR_CODE(enclosing_mark)
297         BOOST_SPIRIT_UNICODE_CHAR_CODE(spacing_mark)
298 
299         BOOST_SPIRIT_UNICODE_CHAR_CODE(decimal_number)
300         BOOST_SPIRIT_UNICODE_CHAR_CODE(letter_number)
301         BOOST_SPIRIT_UNICODE_CHAR_CODE(other_number)
302 
303         BOOST_SPIRIT_UNICODE_CHAR_CODE(space_separator)
304         BOOST_SPIRIT_UNICODE_CHAR_CODE(line_separator)
305         BOOST_SPIRIT_UNICODE_CHAR_CODE(paragraph_separator)
306 
307         BOOST_SPIRIT_UNICODE_CHAR_CODE(control)
308         BOOST_SPIRIT_UNICODE_CHAR_CODE(format)
309         BOOST_SPIRIT_UNICODE_CHAR_CODE(private_use)
310         BOOST_SPIRIT_UNICODE_CHAR_CODE(surrogate)
311         BOOST_SPIRIT_UNICODE_CHAR_CODE(unassigned)
312 
313         BOOST_SPIRIT_UNICODE_CHAR_CODE(dash_punctuation)
314         BOOST_SPIRIT_UNICODE_CHAR_CODE(open_punctuation)
315         BOOST_SPIRIT_UNICODE_CHAR_CODE(close_punctuation)
316         BOOST_SPIRIT_UNICODE_CHAR_CODE(connector_punctuation)
317         BOOST_SPIRIT_UNICODE_CHAR_CODE(other_punctuation)
318         BOOST_SPIRIT_UNICODE_CHAR_CODE(initial_punctuation)
319         BOOST_SPIRIT_UNICODE_CHAR_CODE(final_punctuation)
320 
321         BOOST_SPIRIT_UNICODE_CHAR_CODE(math_symbol)
322         BOOST_SPIRIT_UNICODE_CHAR_CODE(currency_symbol)
323         BOOST_SPIRIT_UNICODE_CHAR_CODE(modifier_symbol)
324         BOOST_SPIRIT_UNICODE_CHAR_CODE(other_symbol)
325 
326     ///////////////////////////////////////////////////////////////////////////
327     //  Unicode Derived Categories
328     ///////////////////////////////////////////////////////////////////////////
329         BOOST_SPIRIT_UNICODE_CHAR_CODE(alphabetic)
330         BOOST_SPIRIT_UNICODE_CHAR_CODE(uppercase)
331         BOOST_SPIRIT_UNICODE_CHAR_CODE(lowercase)
332         BOOST_SPIRIT_UNICODE_CHAR_CODE(white_space)
333         BOOST_SPIRIT_UNICODE_CHAR_CODE(hex_digit)
334         BOOST_SPIRIT_UNICODE_CHAR_CODE(noncharacter_code_point)
335         BOOST_SPIRIT_UNICODE_CHAR_CODE(default_ignorable_code_point)
336 
337     ///////////////////////////////////////////////////////////////////////////
338     //  Unicode Scripts
339     ///////////////////////////////////////////////////////////////////////////
340         BOOST_SPIRIT_UNICODE_CHAR_CODE(arabic)
341         BOOST_SPIRIT_UNICODE_CHAR_CODE(imperial_aramaic)
342         BOOST_SPIRIT_UNICODE_CHAR_CODE(armenian)
343         BOOST_SPIRIT_UNICODE_CHAR_CODE(avestan)
344         BOOST_SPIRIT_UNICODE_CHAR_CODE(balinese)
345         BOOST_SPIRIT_UNICODE_CHAR_CODE(bamum)
346         BOOST_SPIRIT_UNICODE_CHAR_CODE(bengali)
347         BOOST_SPIRIT_UNICODE_CHAR_CODE(bopomofo)
348         BOOST_SPIRIT_UNICODE_CHAR_CODE(braille)
349         BOOST_SPIRIT_UNICODE_CHAR_CODE(buginese)
350         BOOST_SPIRIT_UNICODE_CHAR_CODE(buhid)
351         BOOST_SPIRIT_UNICODE_CHAR_CODE(canadian_aboriginal)
352         BOOST_SPIRIT_UNICODE_CHAR_CODE(carian)
353         BOOST_SPIRIT_UNICODE_CHAR_CODE(cham)
354         BOOST_SPIRIT_UNICODE_CHAR_CODE(cherokee)
355         BOOST_SPIRIT_UNICODE_CHAR_CODE(coptic)
356         BOOST_SPIRIT_UNICODE_CHAR_CODE(cypriot)
357         BOOST_SPIRIT_UNICODE_CHAR_CODE(cyrillic)
358         BOOST_SPIRIT_UNICODE_CHAR_CODE(devanagari)
359         BOOST_SPIRIT_UNICODE_CHAR_CODE(deseret)
360         BOOST_SPIRIT_UNICODE_CHAR_CODE(egyptian_hieroglyphs)
361         BOOST_SPIRIT_UNICODE_CHAR_CODE(ethiopic)
362         BOOST_SPIRIT_UNICODE_CHAR_CODE(georgian)
363         BOOST_SPIRIT_UNICODE_CHAR_CODE(glagolitic)
364         BOOST_SPIRIT_UNICODE_CHAR_CODE(gothic)
365         BOOST_SPIRIT_UNICODE_CHAR_CODE(greek)
366         BOOST_SPIRIT_UNICODE_CHAR_CODE(gujarati)
367         BOOST_SPIRIT_UNICODE_CHAR_CODE(gurmukhi)
368         BOOST_SPIRIT_UNICODE_CHAR_CODE(hangul)
369         BOOST_SPIRIT_UNICODE_CHAR_CODE(han)
370         BOOST_SPIRIT_UNICODE_CHAR_CODE(hanunoo)
371         BOOST_SPIRIT_UNICODE_CHAR_CODE(hebrew)
372         BOOST_SPIRIT_UNICODE_CHAR_CODE(hiragana)
373         BOOST_SPIRIT_UNICODE_CHAR_CODE(katakana_or_hiragana)
374         BOOST_SPIRIT_UNICODE_CHAR_CODE(old_italic)
375         BOOST_SPIRIT_UNICODE_CHAR_CODE(javanese)
376         BOOST_SPIRIT_UNICODE_CHAR_CODE(kayah_li)
377         BOOST_SPIRIT_UNICODE_CHAR_CODE(katakana)
378         BOOST_SPIRIT_UNICODE_CHAR_CODE(kharoshthi)
379         BOOST_SPIRIT_UNICODE_CHAR_CODE(khmer)
380         BOOST_SPIRIT_UNICODE_CHAR_CODE(kannada)
381         BOOST_SPIRIT_UNICODE_CHAR_CODE(kaithi)
382         BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_tham)
383         BOOST_SPIRIT_UNICODE_CHAR_CODE(lao)
384         BOOST_SPIRIT_UNICODE_CHAR_CODE(latin)
385         BOOST_SPIRIT_UNICODE_CHAR_CODE(lepcha)
386         BOOST_SPIRIT_UNICODE_CHAR_CODE(limbu)
387         BOOST_SPIRIT_UNICODE_CHAR_CODE(linear_b)
388         BOOST_SPIRIT_UNICODE_CHAR_CODE(lisu)
389         BOOST_SPIRIT_UNICODE_CHAR_CODE(lycian)
390         BOOST_SPIRIT_UNICODE_CHAR_CODE(lydian)
391         BOOST_SPIRIT_UNICODE_CHAR_CODE(malayalam)
392         BOOST_SPIRIT_UNICODE_CHAR_CODE(mongolian)
393         BOOST_SPIRIT_UNICODE_CHAR_CODE(meetei_mayek)
394         BOOST_SPIRIT_UNICODE_CHAR_CODE(myanmar)
395         BOOST_SPIRIT_UNICODE_CHAR_CODE(nko)
396         BOOST_SPIRIT_UNICODE_CHAR_CODE(ogham)
397         BOOST_SPIRIT_UNICODE_CHAR_CODE(ol_chiki)
398         BOOST_SPIRIT_UNICODE_CHAR_CODE(old_turkic)
399         BOOST_SPIRIT_UNICODE_CHAR_CODE(oriya)
400         BOOST_SPIRIT_UNICODE_CHAR_CODE(osmanya)
401         BOOST_SPIRIT_UNICODE_CHAR_CODE(phags_pa)
402         BOOST_SPIRIT_UNICODE_CHAR_CODE(inscriptional_pahlavi)
403         BOOST_SPIRIT_UNICODE_CHAR_CODE(phoenician)
404         BOOST_SPIRIT_UNICODE_CHAR_CODE(inscriptional_parthian)
405         BOOST_SPIRIT_UNICODE_CHAR_CODE(rejang)
406         BOOST_SPIRIT_UNICODE_CHAR_CODE(runic)
407         BOOST_SPIRIT_UNICODE_CHAR_CODE(samaritan)
408         BOOST_SPIRIT_UNICODE_CHAR_CODE(old_south_arabian)
409         BOOST_SPIRIT_UNICODE_CHAR_CODE(saurashtra)
410         BOOST_SPIRIT_UNICODE_CHAR_CODE(shavian)
411         BOOST_SPIRIT_UNICODE_CHAR_CODE(sinhala)
412         BOOST_SPIRIT_UNICODE_CHAR_CODE(sundanese)
413         BOOST_SPIRIT_UNICODE_CHAR_CODE(syloti_nagri)
414         BOOST_SPIRIT_UNICODE_CHAR_CODE(syriac)
415         BOOST_SPIRIT_UNICODE_CHAR_CODE(tagbanwa)
416         BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_le)
417         BOOST_SPIRIT_UNICODE_CHAR_CODE(new_tai_lue)
418         BOOST_SPIRIT_UNICODE_CHAR_CODE(tamil)
419         BOOST_SPIRIT_UNICODE_CHAR_CODE(tai_viet)
420         BOOST_SPIRIT_UNICODE_CHAR_CODE(telugu)
421         BOOST_SPIRIT_UNICODE_CHAR_CODE(tifinagh)
422         BOOST_SPIRIT_UNICODE_CHAR_CODE(tagalog)
423         BOOST_SPIRIT_UNICODE_CHAR_CODE(thaana)
424         BOOST_SPIRIT_UNICODE_CHAR_CODE(thai)
425         BOOST_SPIRIT_UNICODE_CHAR_CODE(tibetan)
426         BOOST_SPIRIT_UNICODE_CHAR_CODE(ugaritic)
427         BOOST_SPIRIT_UNICODE_CHAR_CODE(vai)
428         BOOST_SPIRIT_UNICODE_CHAR_CODE(old_persian)
429         BOOST_SPIRIT_UNICODE_CHAR_CODE(cuneiform)
430         BOOST_SPIRIT_UNICODE_CHAR_CODE(yi)
431         BOOST_SPIRIT_UNICODE_CHAR_CODE(inherited)
432         BOOST_SPIRIT_UNICODE_CHAR_CODE(common)
433         BOOST_SPIRIT_UNICODE_CHAR_CODE(unknown)
434 
435 #undef BOOST_SPIRIT_UNICODE_CHAR_CODE
436     }}}
437 #endif
438 
439 #endif
440