1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 Copyright (c) 2001-2011 Hartmut Kaiser 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 #if !defined(BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM) 9 #define BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM 10 11 #if defined(_MSC_VER) 12 #pragma once 13 #endif 14 15 #include <string> 16 17 #include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto 18 #include <boost/proto/proto.hpp> 19 #include <boost/config.hpp> 20 #include <boost/mpl/bool.hpp> 21 #include <boost/spirit/home/support/unused.hpp> 22 #include <boost/spirit/home/support/detail/is_spirit_tag.hpp> 23 #include <boost/type_traits/is_signed.hpp> 24 #include <boost/type_traits/make_unsigned.hpp> 25 #include <boost/type_traits/make_signed.hpp> 26 27 #if defined(BOOST_MSVC) 28 # pragma warning(push) 29 # pragma warning(disable: 4127) // conditional expression is constant 30 # pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning 31 #endif 32 33 namespace boost { namespace spirit { namespace detail 34 { 35 // Here's the thing... typical encodings (except ASCII) deal with unsigned 36 // integers > 127. ASCII uses only 127. Yet, most char and wchar_t are signed. 37 // Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you 38 // cast this to an unsigned int with 32 bits, you get 4294967273! 39 // 40 // The trick is to cast to an unsigned version of the source char first 41 // before casting to the target. {P.S. Don't worry about the code, the 42 // optimizer will optimize the if-else branches} 43 44 template <typename TargetChar, typename SourceChar> 45 TargetChar cast_char(SourceChar ch) 46 { 47 if (is_signed<TargetChar>::value != is_signed<SourceChar>::value) 48 { 49 if (is_signed<SourceChar>::value) 50 { 51 // source is signed, target is unsigned 52 typedef typename make_unsigned<SourceChar>::type USourceChar; 53 return TargetChar(USourceChar(ch)); 54 } 55 else 56 { 57 // source is unsigned, target is signed 58 typedef typename make_signed<SourceChar>::type SSourceChar; 59 return TargetChar(SSourceChar(ch)); 60 } 61 } 62 else 63 { 64 // source and target has same signedness 65 return TargetChar(ch); // just cast 66 } 67 } 68 }}} 69 70 namespace boost { namespace spirit { namespace tag 71 { 72 struct char_ { BOOST_SPIRIT_IS_TAG() }; 73 struct string { BOOST_SPIRIT_IS_TAG() }; 74 75 /////////////////////////////////////////////////////////////////////////// 76 // classification tags 77 struct alnum { BOOST_SPIRIT_IS_TAG() }; 78 struct alpha { BOOST_SPIRIT_IS_TAG() }; 79 struct digit { BOOST_SPIRIT_IS_TAG() }; 80 struct xdigit { BOOST_SPIRIT_IS_TAG() }; 81 struct cntrl { BOOST_SPIRIT_IS_TAG() }; 82 struct graph { BOOST_SPIRIT_IS_TAG() }; 83 struct print { BOOST_SPIRIT_IS_TAG() }; 84 struct punct { BOOST_SPIRIT_IS_TAG() }; 85 struct space { BOOST_SPIRIT_IS_TAG() }; 86 struct blank { BOOST_SPIRIT_IS_TAG() }; 87 88 /////////////////////////////////////////////////////////////////////////// 89 // classification/conversion tags 90 struct no_case { BOOST_SPIRIT_IS_TAG() }; 91 struct lower { BOOST_SPIRIT_IS_TAG() }; 92 struct upper { BOOST_SPIRIT_IS_TAG() }; 93 struct lowernum { BOOST_SPIRIT_IS_TAG() }; 94 struct uppernum { BOOST_SPIRIT_IS_TAG() }; 95 struct ucs4 { BOOST_SPIRIT_IS_TAG() }; 96 struct encoding { BOOST_SPIRIT_IS_TAG() }; 97 98 #if defined(BOOST_SPIRIT_UNICODE) 99 /////////////////////////////////////////////////////////////////////////// 100 // Unicode Major Categories 101 /////////////////////////////////////////////////////////////////////////// 102 struct letter { BOOST_SPIRIT_IS_TAG() }; 103 struct mark { BOOST_SPIRIT_IS_TAG() }; 104 struct number { BOOST_SPIRIT_IS_TAG() }; 105 struct separator { BOOST_SPIRIT_IS_TAG() }; 106 struct other { BOOST_SPIRIT_IS_TAG() }; 107 struct punctuation { BOOST_SPIRIT_IS_TAG() }; 108 struct symbol { BOOST_SPIRIT_IS_TAG() }; 109 110 /////////////////////////////////////////////////////////////////////////// 111 // Unicode General Categories 112 /////////////////////////////////////////////////////////////////////////// 113 struct uppercase_letter { BOOST_SPIRIT_IS_TAG() }; 114 struct lowercase_letter { BOOST_SPIRIT_IS_TAG() }; 115 struct titlecase_letter { BOOST_SPIRIT_IS_TAG() }; 116 struct modifier_letter { BOOST_SPIRIT_IS_TAG() }; 117 struct other_letter { BOOST_SPIRIT_IS_TAG() }; 118 119 struct nonspacing_mark { BOOST_SPIRIT_IS_TAG() }; 120 struct enclosing_mark { BOOST_SPIRIT_IS_TAG() }; 121 struct spacing_mark { BOOST_SPIRIT_IS_TAG() }; 122 123 struct decimal_number { BOOST_SPIRIT_IS_TAG() }; 124 struct letter_number { BOOST_SPIRIT_IS_TAG() }; 125 struct other_number { BOOST_SPIRIT_IS_TAG() }; 126 127 struct space_separator { BOOST_SPIRIT_IS_TAG() }; 128 struct line_separator { BOOST_SPIRIT_IS_TAG() }; 129 struct paragraph_separator { BOOST_SPIRIT_IS_TAG() }; 130 131 struct control { BOOST_SPIRIT_IS_TAG() }; 132 struct format { BOOST_SPIRIT_IS_TAG() }; 133 struct private_use { BOOST_SPIRIT_IS_TAG() }; 134 struct surrogate { BOOST_SPIRIT_IS_TAG() }; 135 struct unassigned { BOOST_SPIRIT_IS_TAG() }; 136 137 struct dash_punctuation { BOOST_SPIRIT_IS_TAG() }; 138 struct open_punctuation { BOOST_SPIRIT_IS_TAG() }; 139 struct close_punctuation { BOOST_SPIRIT_IS_TAG() }; 140 struct connector_punctuation { BOOST_SPIRIT_IS_TAG() }; 141 struct other_punctuation { BOOST_SPIRIT_IS_TAG() }; 142 struct initial_punctuation { BOOST_SPIRIT_IS_TAG() }; 143 struct final_punctuation { BOOST_SPIRIT_IS_TAG() }; 144 145 struct math_symbol { BOOST_SPIRIT_IS_TAG() }; 146 struct currency_symbol { BOOST_SPIRIT_IS_TAG() }; 147 struct modifier_symbol { BOOST_SPIRIT_IS_TAG() }; 148 struct other_symbol { BOOST_SPIRIT_IS_TAG() }; 149 150 /////////////////////////////////////////////////////////////////////////// 151 // Unicode Derived Categories 152 /////////////////////////////////////////////////////////////////////////// 153 struct alphabetic { BOOST_SPIRIT_IS_TAG() }; 154 struct uppercase { BOOST_SPIRIT_IS_TAG() }; 155 struct lowercase { BOOST_SPIRIT_IS_TAG() }; 156 struct white_space { BOOST_SPIRIT_IS_TAG() }; 157 struct hex_digit { BOOST_SPIRIT_IS_TAG() }; 158 struct noncharacter_code_point { BOOST_SPIRIT_IS_TAG() }; 159 struct default_ignorable_code_point { BOOST_SPIRIT_IS_TAG() }; 160 161 /////////////////////////////////////////////////////////////////////////// 162 // Unicode Scripts 163 /////////////////////////////////////////////////////////////////////////// 164 struct arabic { BOOST_SPIRIT_IS_TAG() }; 165 struct imperial_aramaic { BOOST_SPIRIT_IS_TAG() }; 166 struct armenian { BOOST_SPIRIT_IS_TAG() }; 167 struct avestan { BOOST_SPIRIT_IS_TAG() }; 168 struct balinese { BOOST_SPIRIT_IS_TAG() }; 169 struct bamum { BOOST_SPIRIT_IS_TAG() }; 170 struct bengali { BOOST_SPIRIT_IS_TAG() }; 171 struct bopomofo { BOOST_SPIRIT_IS_TAG() }; 172 struct braille { BOOST_SPIRIT_IS_TAG() }; 173 struct buginese { BOOST_SPIRIT_IS_TAG() }; 174 struct buhid { BOOST_SPIRIT_IS_TAG() }; 175 struct canadian_aboriginal { BOOST_SPIRIT_IS_TAG() }; 176 struct carian { BOOST_SPIRIT_IS_TAG() }; 177 struct cham { BOOST_SPIRIT_IS_TAG() }; 178 struct cherokee { BOOST_SPIRIT_IS_TAG() }; 179 struct coptic { BOOST_SPIRIT_IS_TAG() }; 180 struct cypriot { BOOST_SPIRIT_IS_TAG() }; 181 struct cyrillic { BOOST_SPIRIT_IS_TAG() }; 182 struct devanagari { BOOST_SPIRIT_IS_TAG() }; 183 struct deseret { BOOST_SPIRIT_IS_TAG() }; 184 struct egyptian_hieroglyphs { BOOST_SPIRIT_IS_TAG() }; 185 struct ethiopic { BOOST_SPIRIT_IS_TAG() }; 186 struct georgian { BOOST_SPIRIT_IS_TAG() }; 187 struct glagolitic { BOOST_SPIRIT_IS_TAG() }; 188 struct gothic { BOOST_SPIRIT_IS_TAG() }; 189 struct greek { BOOST_SPIRIT_IS_TAG() }; 190 struct gujarati { BOOST_SPIRIT_IS_TAG() }; 191 struct gurmukhi { BOOST_SPIRIT_IS_TAG() }; 192 struct hangul { BOOST_SPIRIT_IS_TAG() }; 193 struct han { BOOST_SPIRIT_IS_TAG() }; 194 struct hanunoo { BOOST_SPIRIT_IS_TAG() }; 195 struct hebrew { BOOST_SPIRIT_IS_TAG() }; 196 struct hiragana { BOOST_SPIRIT_IS_TAG() }; 197 struct katakana_or_hiragana { BOOST_SPIRIT_IS_TAG() }; 198 struct old_italic { BOOST_SPIRIT_IS_TAG() }; 199 struct javanese { BOOST_SPIRIT_IS_TAG() }; 200 struct kayah_li { BOOST_SPIRIT_IS_TAG() }; 201 struct katakana { BOOST_SPIRIT_IS_TAG() }; 202 struct kharoshthi { BOOST_SPIRIT_IS_TAG() }; 203 struct khmer { BOOST_SPIRIT_IS_TAG() }; 204 struct kannada { BOOST_SPIRIT_IS_TAG() }; 205 struct kaithi { BOOST_SPIRIT_IS_TAG() }; 206 struct tai_tham { BOOST_SPIRIT_IS_TAG() }; 207 struct lao { BOOST_SPIRIT_IS_TAG() }; 208 struct latin { BOOST_SPIRIT_IS_TAG() }; 209 struct lepcha { BOOST_SPIRIT_IS_TAG() }; 210 struct limbu { BOOST_SPIRIT_IS_TAG() }; 211 struct linear_b { BOOST_SPIRIT_IS_TAG() }; 212 struct lisu { BOOST_SPIRIT_IS_TAG() }; 213 struct lycian { BOOST_SPIRIT_IS_TAG() }; 214 struct lydian { BOOST_SPIRIT_IS_TAG() }; 215 struct malayalam { BOOST_SPIRIT_IS_TAG() }; 216 struct mongolian { BOOST_SPIRIT_IS_TAG() }; 217 struct meetei_mayek { BOOST_SPIRIT_IS_TAG() }; 218 struct myanmar { BOOST_SPIRIT_IS_TAG() }; 219 struct nko { BOOST_SPIRIT_IS_TAG() }; 220 struct ogham { BOOST_SPIRIT_IS_TAG() }; 221 struct ol_chiki { BOOST_SPIRIT_IS_TAG() }; 222 struct old_turkic { BOOST_SPIRIT_IS_TAG() }; 223 struct oriya { BOOST_SPIRIT_IS_TAG() }; 224 struct osmanya { BOOST_SPIRIT_IS_TAG() }; 225 struct phags_pa { BOOST_SPIRIT_IS_TAG() }; 226 struct inscriptional_pahlavi { BOOST_SPIRIT_IS_TAG() }; 227 struct phoenician { BOOST_SPIRIT_IS_TAG() }; 228 struct inscriptional_parthian { BOOST_SPIRIT_IS_TAG() }; 229 struct rejang { BOOST_SPIRIT_IS_TAG() }; 230 struct runic { BOOST_SPIRIT_IS_TAG() }; 231 struct samaritan { BOOST_SPIRIT_IS_TAG() }; 232 struct old_south_arabian { BOOST_SPIRIT_IS_TAG() }; 233 struct saurashtra { BOOST_SPIRIT_IS_TAG() }; 234 struct shavian { BOOST_SPIRIT_IS_TAG() }; 235 struct sinhala { BOOST_SPIRIT_IS_TAG() }; 236 struct sundanese { BOOST_SPIRIT_IS_TAG() }; 237 struct syloti_nagri { BOOST_SPIRIT_IS_TAG() }; 238 struct syriac { BOOST_SPIRIT_IS_TAG() }; 239 struct tagbanwa { BOOST_SPIRIT_IS_TAG() }; 240 struct tai_le { BOOST_SPIRIT_IS_TAG() }; 241 struct new_tai_lue { BOOST_SPIRIT_IS_TAG() }; 242 struct tamil { BOOST_SPIRIT_IS_TAG() }; 243 struct tai_viet { BOOST_SPIRIT_IS_TAG() }; 244 struct telugu { BOOST_SPIRIT_IS_TAG() }; 245 struct tifinagh { BOOST_SPIRIT_IS_TAG() }; 246 struct tagalog { BOOST_SPIRIT_IS_TAG() }; 247 struct thaana { BOOST_SPIRIT_IS_TAG() }; 248 struct thai { BOOST_SPIRIT_IS_TAG() }; 249 struct tibetan { BOOST_SPIRIT_IS_TAG() }; 250 struct ugaritic { BOOST_SPIRIT_IS_TAG() }; 251 struct vai { BOOST_SPIRIT_IS_TAG() }; 252 struct old_persian { BOOST_SPIRIT_IS_TAG() }; 253 struct cuneiform { BOOST_SPIRIT_IS_TAG() }; 254 struct yi { BOOST_SPIRIT_IS_TAG() }; 255 struct inherited { BOOST_SPIRIT_IS_TAG() }; 256 struct common { BOOST_SPIRIT_IS_TAG() }; 257 struct unknown { BOOST_SPIRIT_IS_TAG() }; 258 #endif 259 260 /////////////////////////////////////////////////////////////////////////// 261 // This composite tag type encodes both the character 262 // set and the specific char tag (used for classification 263 // or conversion). char_code_base and char_encoding_base 264 // can be used to test for modifier membership (see modifier.hpp) 265 template <typename CharClass> 266 struct char_code_base {}; 267 268 template <typename CharEncoding> 269 struct char_encoding_base {}; 270 271 template <typename CharClass, typename CharEncoding> 272 struct char_code 273 : char_code_base<CharClass>, char_encoding_base<CharEncoding> 274 { 275 BOOST_SPIRIT_IS_TAG() 276 typedef CharEncoding char_encoding; // e.g. ascii 277 typedef CharClass char_class; // e.g. tag::alnum 278 }; 279 }}} 280 281 namespace boost { namespace spirit { namespace char_class 282 { 283 /////////////////////////////////////////////////////////////////////////// 284 // Test characters for classification 285 template <typename CharEncoding> 286 struct classify 287 { 288 typedef typename CharEncoding::char_type char_type; 289 290 #define BOOST_SPIRIT_CLASSIFY(name, isname) \ 291 template <typename Char> \ 292 static bool \ 293 is(tag::name, Char ch) \ 294 { \ 295 return CharEncoding::isname \ 296 BOOST_PREVENT_MACRO_SUBSTITUTION \ 297 (detail::cast_char<char_type>(ch)); \ 298 } \ 299 /***/ 300 BOOST_SPIRIT_CLASSIFYboost::spirit::char_class::classify301 BOOST_SPIRIT_CLASSIFY(char_, ischar) 302 BOOST_SPIRIT_CLASSIFY(alnum, isalnum) 303 BOOST_SPIRIT_CLASSIFY(alpha, isalpha) 304 BOOST_SPIRIT_CLASSIFY(digit, isdigit) 305 BOOST_SPIRIT_CLASSIFY(xdigit, isxdigit) 306 BOOST_SPIRIT_CLASSIFY(cntrl, iscntrl) 307 BOOST_SPIRIT_CLASSIFY(graph, isgraph) 308 BOOST_SPIRIT_CLASSIFY(lower, islower) 309 BOOST_SPIRIT_CLASSIFY(print, isprint) 310 BOOST_SPIRIT_CLASSIFY(punct, ispunct) 311 BOOST_SPIRIT_CLASSIFY(space, isspace) 312 BOOST_SPIRIT_CLASSIFY(blank, isblank) 313 BOOST_SPIRIT_CLASSIFY(upper, isupper) 314 315 #undef BOOST_SPIRIT_CLASSIFY 316 317 template <typename Char> 318 static bool 319 is(tag::lowernum, Char ch) 320 { 321 return CharEncoding::islower(detail::cast_char<char_type>(ch)) || 322 CharEncoding::isdigit(detail::cast_char<char_type>(ch)); 323 } 324 325 template <typename Char> 326 static bool isboost::spirit::char_class::classify327 is(tag::uppernum, Char ch) 328 { 329 return CharEncoding::isupper(detail::cast_char<char_type>(ch)) || 330 CharEncoding::isdigit(detail::cast_char<char_type>(ch)); 331 } 332 333 #if defined(BOOST_SPIRIT_UNICODE) 334 335 #define BOOST_SPIRIT_UNICODE_CLASSIFY(name) \ 336 template <typename Char> \ 337 static bool \ 338 is(tag::name, Char ch) \ 339 { \ 340 return CharEncoding::is_##name(detail::cast_char<char_type>(ch)); \ 341 } \ 342 /***/ 343 344 /////////////////////////////////////////////////////////////////////////// 345 // Unicode Major Categories 346 /////////////////////////////////////////////////////////////////////////// 347 BOOST_SPIRIT_UNICODE_CLASSIFY(letter) 348 BOOST_SPIRIT_UNICODE_CLASSIFY(mark) 349 BOOST_SPIRIT_UNICODE_CLASSIFY(number) 350 BOOST_SPIRIT_UNICODE_CLASSIFY(separator) 351 BOOST_SPIRIT_UNICODE_CLASSIFY(other) 352 BOOST_SPIRIT_UNICODE_CLASSIFY(punctuation) 353 BOOST_SPIRIT_UNICODE_CLASSIFY(symbol) 354 355 /////////////////////////////////////////////////////////////////////////// 356 // Unicode General Categories 357 /////////////////////////////////////////////////////////////////////////// 358 BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase_letter) 359 BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase_letter) 360 BOOST_SPIRIT_UNICODE_CLASSIFY(titlecase_letter) 361 BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_letter) 362 BOOST_SPIRIT_UNICODE_CLASSIFY(other_letter) 363 364 BOOST_SPIRIT_UNICODE_CLASSIFY(nonspacing_mark) 365 BOOST_SPIRIT_UNICODE_CLASSIFY(enclosing_mark) 366 BOOST_SPIRIT_UNICODE_CLASSIFY(spacing_mark) 367 368 BOOST_SPIRIT_UNICODE_CLASSIFY(decimal_number) 369 BOOST_SPIRIT_UNICODE_CLASSIFY(letter_number) 370 BOOST_SPIRIT_UNICODE_CLASSIFY(other_number) 371 372 BOOST_SPIRIT_UNICODE_CLASSIFY(space_separator) 373 BOOST_SPIRIT_UNICODE_CLASSIFY(line_separator) 374 BOOST_SPIRIT_UNICODE_CLASSIFY(paragraph_separator) 375 376 BOOST_SPIRIT_UNICODE_CLASSIFY(control) 377 BOOST_SPIRIT_UNICODE_CLASSIFY(format) 378 BOOST_SPIRIT_UNICODE_CLASSIFY(private_use) 379 BOOST_SPIRIT_UNICODE_CLASSIFY(surrogate) 380 BOOST_SPIRIT_UNICODE_CLASSIFY(unassigned) 381 382 BOOST_SPIRIT_UNICODE_CLASSIFY(dash_punctuation) 383 BOOST_SPIRIT_UNICODE_CLASSIFY(open_punctuation) 384 BOOST_SPIRIT_UNICODE_CLASSIFY(close_punctuation) 385 BOOST_SPIRIT_UNICODE_CLASSIFY(connector_punctuation) 386 BOOST_SPIRIT_UNICODE_CLASSIFY(other_punctuation) 387 BOOST_SPIRIT_UNICODE_CLASSIFY(initial_punctuation) 388 BOOST_SPIRIT_UNICODE_CLASSIFY(final_punctuation) 389 390 BOOST_SPIRIT_UNICODE_CLASSIFY(math_symbol) 391 BOOST_SPIRIT_UNICODE_CLASSIFY(currency_symbol) 392 BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_symbol) 393 BOOST_SPIRIT_UNICODE_CLASSIFY(other_symbol) 394 395 /////////////////////////////////////////////////////////////////////////// 396 // Unicode Derived Categories 397 /////////////////////////////////////////////////////////////////////////// 398 BOOST_SPIRIT_UNICODE_CLASSIFY(alphabetic) 399 BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase) 400 BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase) 401 BOOST_SPIRIT_UNICODE_CLASSIFY(white_space) 402 BOOST_SPIRIT_UNICODE_CLASSIFY(hex_digit) 403 BOOST_SPIRIT_UNICODE_CLASSIFY(noncharacter_code_point) 404 BOOST_SPIRIT_UNICODE_CLASSIFY(default_ignorable_code_point) 405 406 /////////////////////////////////////////////////////////////////////////// 407 // Unicode Scripts 408 /////////////////////////////////////////////////////////////////////////// 409 BOOST_SPIRIT_UNICODE_CLASSIFY(arabic) 410 BOOST_SPIRIT_UNICODE_CLASSIFY(imperial_aramaic) 411 BOOST_SPIRIT_UNICODE_CLASSIFY(armenian) 412 BOOST_SPIRIT_UNICODE_CLASSIFY(avestan) 413 BOOST_SPIRIT_UNICODE_CLASSIFY(balinese) 414 BOOST_SPIRIT_UNICODE_CLASSIFY(bamum) 415 BOOST_SPIRIT_UNICODE_CLASSIFY(bengali) 416 BOOST_SPIRIT_UNICODE_CLASSIFY(bopomofo) 417 BOOST_SPIRIT_UNICODE_CLASSIFY(braille) 418 BOOST_SPIRIT_UNICODE_CLASSIFY(buginese) 419 BOOST_SPIRIT_UNICODE_CLASSIFY(buhid) 420 BOOST_SPIRIT_UNICODE_CLASSIFY(canadian_aboriginal) 421 BOOST_SPIRIT_UNICODE_CLASSIFY(carian) 422 BOOST_SPIRIT_UNICODE_CLASSIFY(cham) 423 BOOST_SPIRIT_UNICODE_CLASSIFY(cherokee) 424 BOOST_SPIRIT_UNICODE_CLASSIFY(coptic) 425 BOOST_SPIRIT_UNICODE_CLASSIFY(cypriot) 426 BOOST_SPIRIT_UNICODE_CLASSIFY(cyrillic) 427 BOOST_SPIRIT_UNICODE_CLASSIFY(devanagari) 428 BOOST_SPIRIT_UNICODE_CLASSIFY(deseret) 429 BOOST_SPIRIT_UNICODE_CLASSIFY(egyptian_hieroglyphs) 430 BOOST_SPIRIT_UNICODE_CLASSIFY(ethiopic) 431 BOOST_SPIRIT_UNICODE_CLASSIFY(georgian) 432 BOOST_SPIRIT_UNICODE_CLASSIFY(glagolitic) 433 BOOST_SPIRIT_UNICODE_CLASSIFY(gothic) 434 BOOST_SPIRIT_UNICODE_CLASSIFY(greek) 435 BOOST_SPIRIT_UNICODE_CLASSIFY(gujarati) 436 BOOST_SPIRIT_UNICODE_CLASSIFY(gurmukhi) 437 BOOST_SPIRIT_UNICODE_CLASSIFY(hangul) 438 BOOST_SPIRIT_UNICODE_CLASSIFY(han) 439 BOOST_SPIRIT_UNICODE_CLASSIFY(hanunoo) 440 BOOST_SPIRIT_UNICODE_CLASSIFY(hebrew) 441 BOOST_SPIRIT_UNICODE_CLASSIFY(hiragana) 442 BOOST_SPIRIT_UNICODE_CLASSIFY(katakana_or_hiragana) 443 BOOST_SPIRIT_UNICODE_CLASSIFY(old_italic) 444 BOOST_SPIRIT_UNICODE_CLASSIFY(javanese) 445 BOOST_SPIRIT_UNICODE_CLASSIFY(kayah_li) 446 BOOST_SPIRIT_UNICODE_CLASSIFY(katakana) 447 BOOST_SPIRIT_UNICODE_CLASSIFY(kharoshthi) 448 BOOST_SPIRIT_UNICODE_CLASSIFY(khmer) 449 BOOST_SPIRIT_UNICODE_CLASSIFY(kannada) 450 BOOST_SPIRIT_UNICODE_CLASSIFY(kaithi) 451 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_tham) 452 BOOST_SPIRIT_UNICODE_CLASSIFY(lao) 453 BOOST_SPIRIT_UNICODE_CLASSIFY(latin) 454 BOOST_SPIRIT_UNICODE_CLASSIFY(lepcha) 455 BOOST_SPIRIT_UNICODE_CLASSIFY(limbu) 456 BOOST_SPIRIT_UNICODE_CLASSIFY(linear_b) 457 BOOST_SPIRIT_UNICODE_CLASSIFY(lisu) 458 BOOST_SPIRIT_UNICODE_CLASSIFY(lycian) 459 BOOST_SPIRIT_UNICODE_CLASSIFY(lydian) 460 BOOST_SPIRIT_UNICODE_CLASSIFY(malayalam) 461 BOOST_SPIRIT_UNICODE_CLASSIFY(mongolian) 462 BOOST_SPIRIT_UNICODE_CLASSIFY(meetei_mayek) 463 BOOST_SPIRIT_UNICODE_CLASSIFY(myanmar) 464 BOOST_SPIRIT_UNICODE_CLASSIFY(nko) 465 BOOST_SPIRIT_UNICODE_CLASSIFY(ogham) 466 BOOST_SPIRIT_UNICODE_CLASSIFY(ol_chiki) 467 BOOST_SPIRIT_UNICODE_CLASSIFY(old_turkic) 468 BOOST_SPIRIT_UNICODE_CLASSIFY(oriya) 469 BOOST_SPIRIT_UNICODE_CLASSIFY(osmanya) 470 BOOST_SPIRIT_UNICODE_CLASSIFY(phags_pa) 471 BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_pahlavi) 472 BOOST_SPIRIT_UNICODE_CLASSIFY(phoenician) 473 BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_parthian) 474 BOOST_SPIRIT_UNICODE_CLASSIFY(rejang) 475 BOOST_SPIRIT_UNICODE_CLASSIFY(runic) 476 BOOST_SPIRIT_UNICODE_CLASSIFY(samaritan) 477 BOOST_SPIRIT_UNICODE_CLASSIFY(old_south_arabian) 478 BOOST_SPIRIT_UNICODE_CLASSIFY(saurashtra) 479 BOOST_SPIRIT_UNICODE_CLASSIFY(shavian) 480 BOOST_SPIRIT_UNICODE_CLASSIFY(sinhala) 481 BOOST_SPIRIT_UNICODE_CLASSIFY(sundanese) 482 BOOST_SPIRIT_UNICODE_CLASSIFY(syloti_nagri) 483 BOOST_SPIRIT_UNICODE_CLASSIFY(syriac) 484 BOOST_SPIRIT_UNICODE_CLASSIFY(tagbanwa) 485 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_le) 486 BOOST_SPIRIT_UNICODE_CLASSIFY(new_tai_lue) 487 BOOST_SPIRIT_UNICODE_CLASSIFY(tamil) 488 BOOST_SPIRIT_UNICODE_CLASSIFY(tai_viet) 489 BOOST_SPIRIT_UNICODE_CLASSIFY(telugu) 490 BOOST_SPIRIT_UNICODE_CLASSIFY(tifinagh) 491 BOOST_SPIRIT_UNICODE_CLASSIFY(tagalog) 492 BOOST_SPIRIT_UNICODE_CLASSIFY(thaana) 493 BOOST_SPIRIT_UNICODE_CLASSIFY(thai) 494 BOOST_SPIRIT_UNICODE_CLASSIFY(tibetan) 495 BOOST_SPIRIT_UNICODE_CLASSIFY(ugaritic) 496 BOOST_SPIRIT_UNICODE_CLASSIFY(vai) 497 BOOST_SPIRIT_UNICODE_CLASSIFY(old_persian) 498 BOOST_SPIRIT_UNICODE_CLASSIFY(cuneiform) 499 BOOST_SPIRIT_UNICODE_CLASSIFY(yi) 500 BOOST_SPIRIT_UNICODE_CLASSIFY(inherited) 501 BOOST_SPIRIT_UNICODE_CLASSIFY(common) 502 BOOST_SPIRIT_UNICODE_CLASSIFY(unknown) 503 504 #undef BOOST_SPIRIT_UNICODE_CLASSIFY 505 #endif 506 507 }; 508 509 /////////////////////////////////////////////////////////////////////////// 510 // Convert characters 511 template <typename CharEncoding> 512 struct convert 513 { 514 typedef typename CharEncoding::char_type char_type; 515 516 template <typename Char> 517 static Char toboost::spirit::char_class::convert518 to(tag::lower, Char ch) 519 { 520 return static_cast<Char>( 521 CharEncoding::tolower(detail::cast_char<char_type>(ch))); 522 } 523 524 template <typename Char> 525 static Char toboost::spirit::char_class::convert526 to(tag::upper, Char ch) 527 { 528 return static_cast<Char>( 529 CharEncoding::toupper(detail::cast_char<char_type>(ch))); 530 } 531 532 template <typename Char> 533 static Char toboost::spirit::char_class::convert534 to(tag::ucs4, Char ch) 535 { 536 return static_cast<Char>( 537 CharEncoding::toucs4(detail::cast_char<char_type>(ch))); 538 } 539 540 template <typename Char> 541 static Char toboost::spirit::char_class::convert542 to(unused_type, Char ch) 543 { 544 return ch; 545 } 546 }; 547 548 /////////////////////////////////////////////////////////////////////////// 549 // Info on character classification 550 template <typename CharEncoding> 551 struct what 552 { 553 #define BOOST_SPIRIT_CLASSIFY_WHAT(name, isname) \ 554 static char const* is(tag::name) \ 555 { \ 556 return isname; \ 557 } \ 558 /***/ 559 560 BOOST_SPIRIT_CLASSIFY_WHAT(char_, "char") 561 BOOST_SPIRIT_CLASSIFY_WHAT(alnum, "alnum") 562 BOOST_SPIRIT_CLASSIFY_WHAT(alpha, "alpha") 563 BOOST_SPIRIT_CLASSIFY_WHAT(digit, "digit") 564 BOOST_SPIRIT_CLASSIFY_WHAT(xdigit, "xdigit") 565 BOOST_SPIRIT_CLASSIFY_WHAT(cntrl, "cntrl") 566 BOOST_SPIRIT_CLASSIFY_WHAT(graph, "graph") 567 BOOST_SPIRIT_CLASSIFY_WHAT(lower, "lower") 568 BOOST_SPIRIT_CLASSIFY_WHAT(lowernum, "lowernum") 569 BOOST_SPIRIT_CLASSIFY_WHAT(print, "print") 570 BOOST_SPIRIT_CLASSIFY_WHAT(punct, "punct") 571 BOOST_SPIRIT_CLASSIFY_WHAT(space, "space") 572 BOOST_SPIRIT_CLASSIFY_WHAT(blank, "blank") 573 BOOST_SPIRIT_CLASSIFY_WHAT(upper, "upper") 574 BOOST_SPIRIT_CLASSIFY_WHAT(uppernum, "uppernum") 575 BOOST_SPIRIT_CLASSIFY_WHAT(ucs4, "ucs4") 576 577 #undef BOOST_SPIRIT_CLASSIFY_WHAT 578 579 #if defined(BOOST_SPIRIT_UNICODE) 580 581 #define BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(name) \ 582 static char const* is(tag::name) \ 583 { \ 584 return BOOST_PP_STRINGIZE(name); \ 585 } \ 586 /***/ 587 588 /////////////////////////////////////////////////////////////////////////// 589 // Unicode Major Categories 590 /////////////////////////////////////////////////////////////////////////// 591 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter) 592 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mark) 593 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(number) 594 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(separator) 595 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other) 596 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(punctuation) 597 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(symbol) 598 599 /////////////////////////////////////////////////////////////////////////// 600 // Unicode General Categories 601 /////////////////////////////////////////////////////////////////////////// 602 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase_letter) 603 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase_letter) 604 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(titlecase_letter) 605 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_letter) 606 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_letter) 607 608 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nonspacing_mark) 609 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(enclosing_mark) 610 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(spacing_mark) 611 612 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(decimal_number) 613 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter_number) 614 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_number) 615 616 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(space_separator) 617 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(line_separator) 618 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(paragraph_separator) 619 620 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(control) 621 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(format) 622 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(private_use) 623 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(surrogate) 624 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unassigned) 625 626 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(dash_punctuation) 627 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(open_punctuation) 628 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(close_punctuation) 629 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(connector_punctuation) 630 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_punctuation) 631 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(initial_punctuation) 632 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(final_punctuation) 633 634 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(math_symbol) 635 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(currency_symbol) 636 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_symbol) 637 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_symbol) 638 639 /////////////////////////////////////////////////////////////////////////// 640 // Unicode Derived Categories 641 /////////////////////////////////////////////////////////////////////////// 642 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(alphabetic) 643 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase) 644 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase) 645 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(white_space) 646 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hex_digit) 647 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(noncharacter_code_point) 648 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(default_ignorable_code_point) 649 650 /////////////////////////////////////////////////////////////////////////// 651 // Unicode Scripts 652 /////////////////////////////////////////////////////////////////////////// 653 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(arabic) 654 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(imperial_aramaic) 655 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(armenian) 656 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(avestan) 657 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(balinese) 658 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bamum) 659 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bengali) 660 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bopomofo) 661 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(braille) 662 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buginese) 663 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buhid) 664 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(canadian_aboriginal) 665 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(carian) 666 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cham) 667 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cherokee) 668 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(coptic) 669 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cypriot) 670 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cyrillic) 671 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(devanagari) 672 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(deseret) 673 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(egyptian_hieroglyphs) 674 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ethiopic) 675 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(georgian) 676 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(glagolitic) 677 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gothic) 678 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(greek) 679 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gujarati) 680 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gurmukhi) 681 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hangul) 682 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(han) 683 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hanunoo) 684 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hebrew) 685 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hiragana) 686 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana_or_hiragana) 687 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_italic) 688 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(javanese) 689 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kayah_li) 690 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana) 691 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kharoshthi) 692 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(khmer) 693 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kannada) 694 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kaithi) 695 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_tham) 696 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lao) 697 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(latin) 698 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lepcha) 699 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(limbu) 700 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(linear_b) 701 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lisu) 702 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lycian) 703 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lydian) 704 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(malayalam) 705 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mongolian) 706 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(meetei_mayek) 707 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(myanmar) 708 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nko) 709 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ogham) 710 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ol_chiki) 711 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_turkic) 712 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(oriya) 713 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(osmanya) 714 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phags_pa) 715 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_pahlavi) 716 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phoenician) 717 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_parthian) 718 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(rejang) 719 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(runic) 720 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(samaritan) 721 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_south_arabian) 722 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(saurashtra) 723 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(shavian) 724 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sinhala) 725 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sundanese) 726 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syloti_nagri) 727 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syriac) 728 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagbanwa) 729 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_le) 730 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(new_tai_lue) 731 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tamil) 732 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_viet) 733 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(telugu) 734 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tifinagh) 735 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagalog) 736 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thaana) 737 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thai) 738 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tibetan) 739 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ugaritic) 740 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(vai) 741 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_persian) 742 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cuneiform) 743 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(yi) 744 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inherited) 745 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(common) 746 BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unknown) 747 748 #undef BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT 749 #endif 750 751 }; 752 }}} 753 754 namespace boost { namespace spirit { namespace traits 755 { 756 /////////////////////////////////////////////////////////////////////////// 757 template <typename CharParam, typename CharEncoding> 758 struct ischar 759 { callboost::spirit::traits::ischar760 static bool call(CharParam const& ch) 761 { 762 return CharEncoding::ischar(int(ch)); 763 } 764 }; 765 }}} 766 767 #if defined(BOOST_MSVC) 768 # pragma warning(pop) 769 #endif 770 771 #endif 772 773 774