boost/spirit/home/support/common_terminals.hpp
/*============================================================================= Copyright (c) 2001-2010 Joel de Guzman http://spirit.sourceforge.net/ 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) =============================================================================*/ #ifndef BOOST_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM #define BOOST_SPIRIT_COMMON_PLACEHOLDERS_OCTOBER_16_2008_0102PM #if defined(_MSC_VER) #pragma once #endif #include <boost/spirit/home/support/terminal.hpp> #include <boost/spirit/home/support/char_encoding/standard.hpp> #include <boost/spirit/home/support/char_encoding/standard_wide.hpp> #include <boost/spirit/home/support/char_encoding/ascii.hpp> #include <boost/spirit/home/support/char_encoding/iso8859_1.hpp> #include <boost/spirit/home/support/char_class.hpp> namespace boost { namespace spirit { // Our basic terminals BOOST_SPIRIT_DEFINE_TERMINALS( ( verbatim ) ( lexeme ) ( omit ) ( raw ) ( inf ) ( eol ) ( eoi ) ( buffer ) ( true_ ) ( false_ ) ( matches ) ) // Here we are reusing proto::lit using proto::lit; // Our extended terminals BOOST_SPIRIT_DEFINE_TERMINALS_EX( ( bin ) ( oct ) ( hex ) ( bool_ ) ( ushort_ ) ( ulong_ ) ( uint_ ) ( short_ ) ( long_ ) ( int_ ) ( ulong_long ) ( long_long ) ( float_ ) ( double_ ) ( long_double ) ( repeat ) ( eps ) ( pad ) ( byte_ ) ( word ) ( big_word ) ( little_word ) ( dword ) ( big_dword ) ( little_dword ) ( qword ) ( big_qword ) ( little_qword ) ( skip ) ( delimit ) ( stream ) ( wstream ) ( left_align ) ( right_align ) ( center ) ( maxwidth ) ( set_state ) ( in_state ) ( token ) ( attr ) ( columns ) ( auto_ ) ) // special tags (used mainly for stateful tag types) namespace tag { struct attr_cast {}; } }} /////////////////////////////////////////////////////////////////////////////// // Here we place the character-set sensitive placeholders. We have one set // each for ascii, iso8859_1, standard and standard_wide. These placeholders // are placed in its char-set namespace. For example, there exist a placeholder // spirit::ascii::alnum for ascii versions of alnum. #define BOOST_SPIRIT_TAG_CHAR_SPEC(charset) \ typedef tag::char_code<tag::char_, charset> char_; \ typedef tag::char_code<tag::string, charset> string; \ /***/ #define BOOST_SPIRIT_CHAR_SPEC(charset) \ typedef spirit::terminal<tag::charset::char_> char_type; \ char_type const char_ = char_type(); \ \ inline void silence_unused_warnings_##char_() { (void) char_; } \ \ typedef spirit::terminal<tag::charset::string> string_type; \ string_type const string = string_type(); \ \ inline void silence_unused_warnings_##string() { (void) string; } \ /***/ #define BOOST_SPIRIT_CHAR_CODE(name, charset) \ typedef proto::terminal<tag::char_code<tag::name, charset> >::type \ name##_type; \ name##_type const name = name##_type(); \ \ inline void silence_unused_warnings_##name() { (void) name; } \ /***/ #define BOOST_SPIRIT_DEFINE_CHAR_CODES(charset) \ namespace boost { namespace spirit { namespace tag { namespace charset \ { \ BOOST_SPIRIT_TAG_CHAR_SPEC(spirit::char_encoding::charset) \ }}}} \ namespace boost { namespace spirit { namespace charset \ { \ BOOST_SPIRIT_CHAR_SPEC(charset) \ \ BOOST_SPIRIT_CHAR_CODE(alnum, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(alpha, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(blank, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(cntrl, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(digit, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(graph, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(print, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(punct, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(space, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(xdigit, spirit::char_encoding::charset) \ \ BOOST_SPIRIT_CHAR_CODE(no_case, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(lower, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(upper, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(lowernum, spirit::char_encoding::charset) \ BOOST_SPIRIT_CHAR_CODE(uppernum, spirit::char_encoding::charset) \ }}} \ /***/ BOOST_SPIRIT_DEFINE_CHAR_CODES(ascii) BOOST_SPIRIT_DEFINE_CHAR_CODES(iso8859_1) BOOST_SPIRIT_DEFINE_CHAR_CODES(standard) BOOST_SPIRIT_DEFINE_CHAR_CODES(standard_wide) #endif