char_class.hpp 42 KB

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