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