Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/utility/escape_char.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/utility/escape_char.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,184 @@ +/*============================================================================= + Copyright (c) 2001-2003 Daniel Nuffer + 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_ESCAPE_CHAR_HPP +#define BOOST_SPIRIT_ESCAPE_CHAR_HPP + +/////////////////////////////////////////////////////////////////////////////// +#include <string> +#include <iterator> +#include <cctype> +#include <boost/limits.hpp> + +#include <boost/spirit/home/classic/namespace.hpp> +#include <boost/spirit/home/classic/debug.hpp> + +#include <boost/spirit/home/classic/utility/escape_char_fwd.hpp> +#include <boost/spirit/home/classic/utility/impl/escape_char.ipp> + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { namespace spirit { + +BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// +// escape_char_action class +// +// Links an escape char parser with a user defined semantic action. +// The semantic action may be a function or a functor. A function +// should be compatible with the interface: +// +// void f(CharT ch); +// +// A functor should have a member operator() with a compatible signature +// as above. The matching character is passed into the function/functor. +// This is the default class that character parsers use when dealing with +// the construct: +// +// p[f] +// +// where p is a parser and f is a function or functor. +// +/////////////////////////////////////////////////////////////////////////////// +template < + typename ParserT, typename ActionT, + unsigned long Flags, typename CharT +> +struct escape_char_action +: public unary<ParserT, + parser<escape_char_action<ParserT, ActionT, Flags, CharT> > > +{ + typedef escape_char_action + <ParserT, ActionT, Flags, CharT> self_t; + typedef action_parser_category parser_category_t; + typedef unary<ParserT, parser<self_t> > base_t; + + template <typename ScannerT> + struct result + { + typedef typename match_result<ScannerT, CharT>::type type; + }; + + escape_char_action(ParserT const& p, ActionT const& a) + : base_t(p), actor(a) {} + + template <typename ScannerT> + typename parser_result<self_t, ScannerT>::type + parse(ScannerT const& scan) const + { + return impl::escape_char_action_parse<Flags, CharT>:: + parse(scan, *this); + } + + ActionT const& predicate() const { return actor; } + +private: + + ActionT actor; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// escape_char_parser class +// +// The escape_char_parser helps in conjunction with the escape_char_action +// template class (see above) in parsing escaped characters. There are two +// different variants of this parser: one for parsing C style escaped +// characters and one for parsing LEX style escaped characters. +// +// The C style escaped character parser is generated, when the template +// parameter 'Flags' is equal to 'c_escapes' (a constant defined in the +// file impl/escape_char.ipp). This parser recognizes all valid C escape +// character sequences: '\t', '\b', '\f', '\n', '\r', '\"', '\'', '\\' +// and the numeric style escapes '\120' (octal) and '\x2f' (hexadecimal) +// and converts these to their character equivalent, for instance the +// sequence of a backslash and a 'b' is parsed as the character '\b'. +// All other escaped characters are rejected by this parser. +// +// The LEX style escaped character parser is generated, when the template +// parameter 'Flags' is equal to 'lex_escapes' (a constant defined in the +// file impl/escape_char.ipp). This parser recognizes all the C style +// escaped character sequences (as described above) and additionally +// does not reject all other escape sequences. All not mentioned escape +// sequences are converted by the parser to the plain character, for +// instance '\a' will be parsed as 'a'. +// +// All not escaped characters are parsed without modification. +// +/////////////////////////////////////////////////////////////////////////////// + +template <unsigned long Flags, typename CharT> +struct escape_char_action_parser_gen; + +template <unsigned long Flags, typename CharT> +struct escape_char_parser : + public parser<escape_char_parser<Flags, CharT> > { + + // only the values c_escapes and lex_escapes are valid for Flags + BOOST_STATIC_ASSERT(Flags == c_escapes || Flags == lex_escapes); + + typedef escape_char_parser<Flags, CharT> self_t; + typedef + escape_char_action_parser_gen<Flags, CharT> + action_parser_generator_t; + + template <typename ScannerT> + struct result { + + typedef typename match_result<ScannerT, CharT>::type type; + }; + + template <typename ActionT> + escape_char_action<self_t, ActionT, Flags, CharT> + operator[](ActionT const& actor) const + { + return escape_char_action<self_t, ActionT, Flags, CharT>(*this, actor); + } + + template <typename ScannerT> + typename parser_result<self_t, ScannerT>::type + parse(ScannerT const &scan) const + { + return impl::escape_char_parse<CharT>::parse(scan, *this); + } +}; + +template <unsigned long Flags, typename CharT> +struct escape_char_action_parser_gen { + + template <typename ParserT, typename ActionT> + static escape_char_action<ParserT, ActionT, Flags, CharT> + generate (ParserT const &p, ActionT const &actor) + { + typedef + escape_char_action<ParserT, ActionT, Flags, CharT> + action_parser_t; + return action_parser_t(p, actor); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// predefined escape_char_parser objects +// +// These objects should be used for generating correct escaped character +// parsers. +// +/////////////////////////////////////////////////////////////////////////////// +const escape_char_parser<lex_escapes> lex_escape_ch_p = + escape_char_parser<lex_escapes>(); + +const escape_char_parser<c_escapes> c_escape_ch_p = + escape_char_parser<c_escapes>(); + +/////////////////////////////////////////////////////////////////////////////// +BOOST_SPIRIT_CLASSIC_NAMESPACE_END + +}} // namespace BOOST_SPIRIT_CLASSIC_NS + +#endif