ee1c4791b6
[SVN r71202]
73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
// 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;
|
|
}
|