| // 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; |
| } |