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