123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- // Copyright (c) 2010 Jeroen Habraken
- //
- // 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)
- #include <boost/spirit/include/qi.hpp>
- #include <iostream>
- #include <ostream>
- #include <string>
- namespace client
- {
- namespace qi = boost::spirit::qi;
- template <typename InputIterator>
- struct unescaped_string
- : qi::grammar<InputIterator, std::string(char const*)>
- {
- unescaped_string()
- : unescaped_string::base_type(unesc_str)
- {
- unesc_char.add("\\a", '\a')("\\b", '\b')("\\f", '\f')("\\n", '\n')
- ("\\r", '\r')("\\t", '\t')("\\v", '\v')("\\\\", '\\')
- ("\\\'", '\'')("\\\"", '\"')
- ;
- unesc_str = qi::lit(qi::_r1)
- >> *(unesc_char | qi::alnum | "\\x" >> qi::hex)
- >> qi::lit(qi::_r1)
- ;
- }
- qi::rule<InputIterator, std::string(char const*)> unesc_str;
- qi::symbols<char const, char const> unesc_char;
- };
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Main program
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- namespace qi = boost::spirit::qi;
-
- typedef std::string::const_iterator iterator_type;
- std::string parsed;
- std::string str("'''string\\x20to\\x20unescape\\x3a\\x20\\n\\r\\t\\\"\\'\\x41'''");
- char const* quote = "'''";
- iterator_type iter = str.begin();
- iterator_type end = str.end();
- client::unescaped_string<iterator_type> p;
- if (!qi::parse(iter, end, p(quote), parsed))
- {
- std::cout << "-------------------------\n";
- std::cout << "Parsing failed\n";
- std::cout << "-------------------------\n";
- }
- else
- {
- std::cout << "-------------------------\n";
- std::cout << "Parsed: " << parsed << "\n";
- std::cout << "-------------------------\n";
- }
-
- return 0;
- }
|