]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/example/qi/unescaped_string.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / example / qi / unescaped_string.cpp
CommitLineData
7c673cae
FG
1// Copyright (c) 2010 Jeroen Habraken
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#include <boost/spirit/include/qi.hpp>
7
8#include <iostream>
9#include <ostream>
10#include <string>
11
12namespace client
13{
14 namespace qi = boost::spirit::qi;
15
16 template <typename InputIterator>
17 struct unescaped_string
18 : qi::grammar<InputIterator, std::string(char const*)>
19 {
20 unescaped_string()
21 : unescaped_string::base_type(unesc_str)
22 {
23 unesc_char.add("\\a", '\a')("\\b", '\b')("\\f", '\f')("\\n", '\n')
24 ("\\r", '\r')("\\t", '\t')("\\v", '\v')("\\\\", '\\')
25 ("\\\'", '\'')("\\\"", '\"')
26 ;
27
28 unesc_str = qi::lit(qi::_r1)
29 >> *(unesc_char | qi::alnum | "\\x" >> qi::hex)
30 >> qi::lit(qi::_r1)
31 ;
32 }
33
34 qi::rule<InputIterator, std::string(char const*)> unesc_str;
35 qi::symbols<char const, char const> unesc_char;
36 };
37
38}
39
40///////////////////////////////////////////////////////////////////////////////
41// Main program
42///////////////////////////////////////////////////////////////////////////////
43int main()
44{
45 namespace qi = boost::spirit::qi;
46
47 typedef std::string::const_iterator iterator_type;
48
49 std::string parsed;
50
51 std::string str("'''string\\x20to\\x20unescape\\x3a\\x20\\n\\r\\t\\\"\\'\\x41'''");
52 char const* quote = "'''";
53
54 iterator_type iter = str.begin();
55 iterator_type end = str.end();
56
57 client::unescaped_string<iterator_type> p;
58 if (!qi::parse(iter, end, p(quote), parsed))
59 {
60 std::cout << "-------------------------\n";
61 std::cout << "Parsing failed\n";
62 std::cout << "-------------------------\n";
63 }
64 else
65 {
66 std::cout << "-------------------------\n";
67 std::cout << "Parsed: " << parsed << "\n";
68 std::cout << "-------------------------\n";
69 }
70
71 return 0;
72}