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