/*============================================================================= | |
Copyright (c) 2001-2011 Joel de Guzman | |
Copyright (c) 2001-2011 Hartmut Kaiser | |
Distributed under the Boost Software License, Version 1.0. (See accompanying | |
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
=============================================================================*/ | |
#if !defined(BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM) | |
#define BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM | |
#if defined(_MSC_VER) | |
#pragma once | |
#endif | |
#include <string> | |
#include <boost/proto/proto.hpp> | |
#include <boost/config.hpp> | |
#include <boost/mpl/bool.hpp> | |
#include <boost/spirit/home/support/unused.hpp> | |
#include <boost/type_traits/is_signed.hpp> | |
#include <boost/type_traits/make_unsigned.hpp> | |
#include <boost/type_traits/make_signed.hpp> | |
#if defined(BOOST_MSVC) | |
# pragma warning(push) | |
# pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning | |
#endif | |
namespace boost { namespace spirit { namespace detail | |
{ | |
// Here's the thing... typical encodings (except ASCII) deal with unsigned | |
// integers > 127. ASCII uses only 127. Yet, most char and wchar_t are signed. | |
// Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you | |
// cast this to an unsigned int with 32 bits, you get 4294967273! | |
// | |
// The trick is to cast to an unsigned version of the source char first | |
// before casting to the target. {P.S. Don't worry about the code, the | |
// optimizer will optimize the if-else branches} | |
template <typename TargetChar, typename SourceChar> | |
TargetChar cast_char(SourceChar ch) | |
{ | |
if (is_signed<TargetChar>::value != is_signed<SourceChar>::value) | |
{ | |
if (is_signed<SourceChar>::value) | |
{ | |
// source is signed, target is unsigned | |
typedef typename make_unsigned<SourceChar>::type USourceChar; | |
return TargetChar(USourceChar(ch)); | |
} | |
else | |
{ | |
// source is unsigned, target is signed | |
typedef typename make_signed<SourceChar>::type SSourceChar; | |
return TargetChar(SSourceChar(ch)); | |
} | |
} | |
else | |
{ | |
// source and target has same signedness | |
return TargetChar(ch); // just cast | |
} | |
} | |
}}} | |
namespace boost { namespace spirit { namespace tag | |
{ | |
struct char_ {}; | |
struct string {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// classification tags | |
struct alnum {}; | |
struct alpha {}; | |
struct digit {}; | |
struct xdigit {}; | |
struct cntrl {}; | |
struct graph {}; | |
struct print {}; | |
struct punct {}; | |
struct space {}; | |
struct blank {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// classification/conversion tags | |
struct no_case {}; | |
struct lower {}; | |
struct upper {}; | |
struct lowernum {}; | |
struct uppernum {}; | |
struct ucs4 {}; | |
struct encoding {}; | |
#if defined(BOOST_SPIRIT_UNICODE) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Major Categories | |
/////////////////////////////////////////////////////////////////////////// | |
struct letter {}; | |
struct mark {}; | |
struct number {}; | |
struct separator {}; | |
struct other {}; | |
struct punctuation {}; | |
struct symbol {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode General Categories | |
/////////////////////////////////////////////////////////////////////////// | |
struct uppercase_letter {}; | |
struct lowercase_letter {}; | |
struct titlecase_letter {}; | |
struct modifier_letter {}; | |
struct other_letter {}; | |
struct nonspacing_mark {}; | |
struct enclosing_mark {}; | |
struct spacing_mark {}; | |
struct decimal_number {}; | |
struct letter_number {}; | |
struct other_number {}; | |
struct space_separator {}; | |
struct line_separator {}; | |
struct paragraph_separator {}; | |
struct control {}; | |
struct format {}; | |
struct private_use {}; | |
struct surrogate {}; | |
struct unassigned {}; | |
struct dash_punctuation {}; | |
struct open_punctuation {}; | |
struct close_punctuation {}; | |
struct connector_punctuation {}; | |
struct other_punctuation {}; | |
struct initial_punctuation {}; | |
struct final_punctuation {}; | |
struct math_symbol {}; | |
struct currency_symbol {}; | |
struct modifier_symbol {}; | |
struct other_symbol {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Derived Categories | |
/////////////////////////////////////////////////////////////////////////// | |
struct alphabetic {}; | |
struct uppercase {}; | |
struct lowercase {}; | |
struct white_space {}; | |
struct hex_digit {}; | |
struct noncharacter_code_point {}; | |
struct default_ignorable_code_point {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Scripts | |
/////////////////////////////////////////////////////////////////////////// | |
struct arabic {}; | |
struct imperial_aramaic {}; | |
struct armenian {}; | |
struct avestan {}; | |
struct balinese {}; | |
struct bamum {}; | |
struct bengali {}; | |
struct bopomofo {}; | |
struct braille {}; | |
struct buginese {}; | |
struct buhid {}; | |
struct canadian_aboriginal {}; | |
struct carian {}; | |
struct cham {}; | |
struct cherokee {}; | |
struct coptic {}; | |
struct cypriot {}; | |
struct cyrillic {}; | |
struct devanagari {}; | |
struct deseret {}; | |
struct egyptian_hieroglyphs {}; | |
struct ethiopic {}; | |
struct georgian {}; | |
struct glagolitic {}; | |
struct gothic {}; | |
struct greek {}; | |
struct gujarati {}; | |
struct gurmukhi {}; | |
struct hangul {}; | |
struct han {}; | |
struct hanunoo {}; | |
struct hebrew {}; | |
struct hiragana {}; | |
struct katakana_or_hiragana {}; | |
struct old_italic {}; | |
struct javanese {}; | |
struct kayah_li {}; | |
struct katakana {}; | |
struct kharoshthi {}; | |
struct khmer {}; | |
struct kannada {}; | |
struct kaithi {}; | |
struct tai_tham {}; | |
struct lao {}; | |
struct latin {}; | |
struct lepcha {}; | |
struct limbu {}; | |
struct linear_b {}; | |
struct lisu {}; | |
struct lycian {}; | |
struct lydian {}; | |
struct malayalam {}; | |
struct mongolian {}; | |
struct meetei_mayek {}; | |
struct myanmar {}; | |
struct nko {}; | |
struct ogham {}; | |
struct ol_chiki {}; | |
struct old_turkic {}; | |
struct oriya {}; | |
struct osmanya {}; | |
struct phags_pa {}; | |
struct inscriptional_pahlavi {}; | |
struct phoenician {}; | |
struct inscriptional_parthian {}; | |
struct rejang {}; | |
struct runic {}; | |
struct samaritan {}; | |
struct old_south_arabian {}; | |
struct saurashtra {}; | |
struct shavian {}; | |
struct sinhala {}; | |
struct sundanese {}; | |
struct syloti_nagri {}; | |
struct syriac {}; | |
struct tagbanwa {}; | |
struct tai_le {}; | |
struct new_tai_lue {}; | |
struct tamil {}; | |
struct tai_viet {}; | |
struct telugu {}; | |
struct tifinagh {}; | |
struct tagalog {}; | |
struct thaana {}; | |
struct thai {}; | |
struct tibetan {}; | |
struct ugaritic {}; | |
struct vai {}; | |
struct old_persian {}; | |
struct cuneiform {}; | |
struct yi {}; | |
struct inherited {}; | |
struct common {}; | |
struct unknown {}; | |
#endif | |
/////////////////////////////////////////////////////////////////////////// | |
// This composite tag type encodes both the character | |
// set and the specific char tag (used for classification | |
// or conversion). char_code_base and char_encoding_base | |
// can be used to test for modifier membership (see modifier.hpp) | |
template <typename CharClass> | |
struct char_code_base {}; | |
template <typename CharEncoding> | |
struct char_encoding_base {}; | |
template <typename CharClass, typename CharEncoding> | |
struct char_code | |
: char_code_base<CharClass>, char_encoding_base<CharEncoding> | |
{ | |
typedef CharEncoding char_encoding; // e.g. ascii | |
typedef CharClass char_class; // e.g. tag::alnum | |
}; | |
}}} | |
namespace boost { namespace spirit { namespace char_class | |
{ | |
/////////////////////////////////////////////////////////////////////////// | |
// Test characters for classification | |
template <typename CharEncoding> | |
struct classify | |
{ | |
typedef typename CharEncoding::char_type char_type; | |
#define BOOST_SPIRIT_CLASSIFY(name, isname) \ | |
template <typename Char> \ | |
static bool \ | |
is(tag::name, Char ch) \ | |
{ \ | |
return CharEncoding::isname \ | |
BOOST_PREVENT_MACRO_SUBSTITUTION \ | |
(detail::cast_char<char_type>(ch)); \ | |
} \ | |
/***/ | |
BOOST_SPIRIT_CLASSIFY(char_, ischar) | |
BOOST_SPIRIT_CLASSIFY(alnum, isalnum) | |
BOOST_SPIRIT_CLASSIFY(alpha, isalpha) | |
BOOST_SPIRIT_CLASSIFY(digit, isdigit) | |
BOOST_SPIRIT_CLASSIFY(xdigit, isxdigit) | |
BOOST_SPIRIT_CLASSIFY(cntrl, iscntrl) | |
BOOST_SPIRIT_CLASSIFY(graph, isgraph) | |
BOOST_SPIRIT_CLASSIFY(lower, islower) | |
BOOST_SPIRIT_CLASSIFY(print, isprint) | |
BOOST_SPIRIT_CLASSIFY(punct, ispunct) | |
BOOST_SPIRIT_CLASSIFY(space, isspace) | |
BOOST_SPIRIT_CLASSIFY(blank, isblank) | |
BOOST_SPIRIT_CLASSIFY(upper, isupper) | |
#undef BOOST_SPIRIT_CLASSIFY | |
template <typename Char> | |
static bool | |
is(tag::lowernum, Char ch) | |
{ | |
return CharEncoding::islower(detail::cast_char<char_type>(ch)) || | |
CharEncoding::isdigit(detail::cast_char<char_type>(ch)); | |
} | |
template <typename Char> | |
static bool | |
is(tag::uppernum, Char ch) | |
{ | |
return CharEncoding::isupper(detail::cast_char<char_type>(ch)) || | |
CharEncoding::isdigit(detail::cast_char<char_type>(ch)); | |
} | |
#if defined(BOOST_SPIRIT_UNICODE) | |
#define BOOST_SPIRIT_UNICODE_CLASSIFY(name) \ | |
template <typename Char> \ | |
static bool \ | |
is(tag::name, Char ch) \ | |
{ \ | |
return CharEncoding::is_##name(detail::cast_char<char_type>(ch)); \ | |
} \ | |
/***/ | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Major Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY(letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(other) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(symbol) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode General Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(titlecase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(other_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(nonspacing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(enclosing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(spacing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(decimal_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(letter_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(other_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(space_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(line_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(paragraph_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(control) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(format) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(private_use) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(surrogate) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(unassigned) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(dash_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(open_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(close_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(connector_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(other_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(initial_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(final_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(math_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(currency_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(other_symbol) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Derived Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY(alphabetic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(white_space) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(hex_digit) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(noncharacter_code_point) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(default_ignorable_code_point) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Scripts | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY(arabic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(imperial_aramaic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(armenian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(avestan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(balinese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(bamum) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(bengali) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(bopomofo) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(braille) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(buginese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(buhid) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(canadian_aboriginal) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(carian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(cham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(cherokee) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(coptic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(cypriot) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(cyrillic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(devanagari) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(deseret) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(egyptian_hieroglyphs) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(ethiopic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(georgian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(glagolitic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(gothic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(greek) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(gujarati) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(gurmukhi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(hangul) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(han) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(hanunoo) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(hebrew) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(hiragana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(katakana_or_hiragana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(old_italic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(javanese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(kayah_li) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(katakana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(kharoshthi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(khmer) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(kannada) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(kaithi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tai_tham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lao) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(latin) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lepcha) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(limbu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(linear_b) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lisu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lycian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(lydian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(malayalam) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(mongolian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(meetei_mayek) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(myanmar) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(nko) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(ogham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(ol_chiki) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(old_turkic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(oriya) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(osmanya) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(phags_pa) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_pahlavi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(phoenician) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_parthian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(rejang) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(runic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(samaritan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(old_south_arabian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(saurashtra) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(shavian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(sinhala) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(sundanese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(syloti_nagri) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(syriac) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tagbanwa) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tai_le) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(new_tai_lue) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tamil) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tai_viet) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(telugu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tifinagh) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tagalog) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(thaana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(thai) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(tibetan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(ugaritic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(vai) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(old_persian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(cuneiform) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(yi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(inherited) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(common) | |
BOOST_SPIRIT_UNICODE_CLASSIFY(unknown) | |
#undef BOOST_SPIRIT_UNICODE_CLASSIFY | |
#endif | |
}; | |
/////////////////////////////////////////////////////////////////////////// | |
// Convert characters | |
template <typename CharEncoding> | |
struct convert | |
{ | |
typedef typename CharEncoding::char_type char_type; | |
template <typename Char> | |
static Char | |
to(tag::lower, Char ch) | |
{ | |
return static_cast<Char>( | |
CharEncoding::tolower(detail::cast_char<char_type>(ch))); | |
} | |
template <typename Char> | |
static Char | |
to(tag::upper, Char ch) | |
{ | |
return static_cast<Char>( | |
CharEncoding::toupper(detail::cast_char<char_type>(ch))); | |
} | |
template <typename Char> | |
static Char | |
to(tag::ucs4, Char ch) | |
{ | |
return static_cast<Char>( | |
CharEncoding::toucs4(detail::cast_char<char_type>(ch))); | |
} | |
template <typename Char> | |
static Char | |
to(unused_type, Char ch) | |
{ | |
return ch; | |
} | |
}; | |
/////////////////////////////////////////////////////////////////////////// | |
// Info on character classification | |
template <typename CharEncoding> | |
struct what | |
{ | |
#define BOOST_SPIRIT_CLASSIFY_WHAT(name, isname) \ | |
static char const* is(tag::name) \ | |
{ \ | |
return isname; \ | |
} \ | |
/***/ | |
BOOST_SPIRIT_CLASSIFY_WHAT(char_, "char") | |
BOOST_SPIRIT_CLASSIFY_WHAT(alnum, "alnum") | |
BOOST_SPIRIT_CLASSIFY_WHAT(alpha, "alpha") | |
BOOST_SPIRIT_CLASSIFY_WHAT(digit, "digit") | |
BOOST_SPIRIT_CLASSIFY_WHAT(xdigit, "xdigit") | |
BOOST_SPIRIT_CLASSIFY_WHAT(cntrl, "cntrl") | |
BOOST_SPIRIT_CLASSIFY_WHAT(graph, "graph") | |
BOOST_SPIRIT_CLASSIFY_WHAT(lower, "lower") | |
BOOST_SPIRIT_CLASSIFY_WHAT(lowernum, "lowernum") | |
BOOST_SPIRIT_CLASSIFY_WHAT(print, "print") | |
BOOST_SPIRIT_CLASSIFY_WHAT(punct, "punct") | |
BOOST_SPIRIT_CLASSIFY_WHAT(space, "space") | |
BOOST_SPIRIT_CLASSIFY_WHAT(blank, "blank") | |
BOOST_SPIRIT_CLASSIFY_WHAT(upper, "upper") | |
BOOST_SPIRIT_CLASSIFY_WHAT(uppernum, "uppernum") | |
BOOST_SPIRIT_CLASSIFY_WHAT(ucs4, "ucs4") | |
#undef BOOST_SPIRIT_CLASSIFY_WHAT | |
#if defined(BOOST_SPIRIT_UNICODE) | |
#define BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(name) \ | |
static char const* is(tag::name) \ | |
{ \ | |
return BOOST_PP_STRINGIZE(name); \ | |
} \ | |
/***/ | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Major Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(symbol) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode General Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(titlecase_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_letter) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nonspacing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(enclosing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(spacing_mark) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(decimal_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_number) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(space_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(line_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(paragraph_separator) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(control) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(format) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(private_use) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(surrogate) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unassigned) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(dash_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(open_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(close_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(connector_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(initial_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(final_punctuation) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(math_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(currency_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_symbol) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_symbol) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Derived Categories | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(alphabetic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(white_space) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hex_digit) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(noncharacter_code_point) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(default_ignorable_code_point) | |
/////////////////////////////////////////////////////////////////////////// | |
// Unicode Scripts | |
/////////////////////////////////////////////////////////////////////////// | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(arabic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(imperial_aramaic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(armenian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(avestan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(balinese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bamum) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bengali) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bopomofo) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(braille) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buginese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buhid) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(canadian_aboriginal) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(carian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cherokee) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(coptic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cypriot) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cyrillic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(devanagari) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(deseret) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(egyptian_hieroglyphs) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ethiopic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(georgian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(glagolitic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gothic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(greek) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gujarati) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gurmukhi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hangul) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(han) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hanunoo) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hebrew) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hiragana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana_or_hiragana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_italic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(javanese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kayah_li) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kharoshthi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(khmer) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kannada) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kaithi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_tham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lao) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(latin) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lepcha) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(limbu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(linear_b) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lisu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lycian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lydian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(malayalam) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mongolian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(meetei_mayek) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(myanmar) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nko) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ogham) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ol_chiki) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_turkic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(oriya) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(osmanya) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phags_pa) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_pahlavi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phoenician) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_parthian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(rejang) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(runic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(samaritan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_south_arabian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(saurashtra) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(shavian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sinhala) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sundanese) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syloti_nagri) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syriac) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagbanwa) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_le) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(new_tai_lue) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tamil) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_viet) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(telugu) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tifinagh) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagalog) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thaana) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thai) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tibetan) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ugaritic) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(vai) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_persian) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cuneiform) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(yi) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inherited) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(common) | |
BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unknown) | |
#undef BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT | |
#endif | |
}; | |
}}} | |
namespace boost { namespace spirit { namespace traits | |
{ | |
/////////////////////////////////////////////////////////////////////////// | |
// This meta-function evaluates to mpl::true_ if the function | |
// char_encoding::ischar() needs to be called to ensure correct matching. | |
// This happens mainly if the character type returned from the underlying | |
// iterator is larger than the character type of the used character | |
// encoding. Additionally, this meta-function provides a customization | |
// point for the lexer library to enforce this behavior while parsing | |
// a token stream. | |
template <typename Char, typename BaseChar> | |
struct mustcheck_ischar | |
: mpl::bool_<(sizeof(Char) > sizeof(BaseChar)) ? true : false> {}; | |
/////////////////////////////////////////////////////////////////////////// | |
// The following template calls char_encoding::ischar, if necessary | |
template <typename CharParam, typename CharEncoding | |
, bool MustCheck = mustcheck_ischar< | |
CharParam, typename CharEncoding::char_type>::value> | |
struct ischar | |
{ | |
static bool call(CharParam) | |
{ | |
return true; | |
} | |
}; | |
template <typename CharParam, typename CharEncoding> | |
struct ischar<CharParam, CharEncoding, true> | |
{ | |
static bool call(CharParam const& ch) | |
{ | |
return CharEncoding::ischar(int(ch)); | |
} | |
}; | |
}}} | |
#if defined(BOOST_MSVC) | |
# pragma warning(pop) | |
#endif | |
#endif | |