]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright (c) 2009 Chris Hoeppler |
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 | // The purpose of this example is to demonstrate different use cases for the | |
7 | // confix directive. | |
8 | ||
9 | #include <iostream> | |
10 | #include <string> | |
11 | #include <vector> | |
12 | ||
13 | //[qi_confix_includes | |
14 | #include <boost/spirit/include/qi.hpp> | |
15 | #include <boost/spirit/repository/include/qi_confix.hpp> | |
16 | //] | |
17 | ||
18 | namespace client { | |
19 | //[qi_confix_using | |
20 | using boost::spirit::eol; | |
21 | using boost::spirit::lexeme; | |
22 | using boost::spirit::ascii::alnum; | |
23 | using boost::spirit::ascii::char_; | |
24 | using boost::spirit::ascii::space; | |
25 | using boost::spirit::qi::parse; | |
26 | using boost::spirit::qi::phrase_parse; | |
27 | using boost::spirit::repository::confix; | |
28 | //] | |
29 | ||
30 | //[qi_confix_cpp_comment | |
31 | template <typename Iterator> | |
32 | bool parse_cpp_comment(Iterator first, Iterator last, std::string& attr) | |
33 | { | |
34 | bool r = parse(first, last, | |
35 | confix("//", eol)[*(char_ - eol)], // grammar | |
36 | attr); // attribute | |
37 | ||
38 | if (!r || first != last) // fail if we did not get a full match | |
39 | return false; | |
40 | return r; | |
41 | } | |
42 | //] | |
43 | ||
44 | //[qi_confix_c_comment | |
45 | template <typename Iterator> | |
46 | bool parse_c_comment(Iterator first, Iterator last, std::string& attr) | |
47 | { | |
48 | bool r = parse(first, last, | |
49 | confix("/*", "*/")[*(char_ - "*/")], // grammar | |
50 | attr); // attribute | |
51 | ||
52 | if (!r || first != last) // fail if we did not get a full match | |
53 | return false; | |
54 | return r; | |
55 | } | |
56 | //] | |
57 | ||
58 | //[qi_confix_tagged_data | |
59 | template <typename Iterator> | |
60 | bool parse_tagged(Iterator first, Iterator last, std::string& attr) | |
61 | { | |
62 | bool r = phrase_parse(first, last, | |
63 | confix("<b>", "</b>")[lexeme[*(char_ - '<')]], // grammar | |
64 | space, // skip | |
65 | attr); // attribute | |
66 | ||
67 | if (!r || first != last) // fail if we did not get a full match | |
68 | return false; | |
69 | return r; | |
70 | } | |
71 | //] | |
72 | } | |
73 | ||
74 | ||
75 | int main() | |
76 | { | |
77 | // C++ comment | |
78 | std::string comment("// This is a comment\n"); | |
79 | std::string attr; | |
80 | bool r = client::parse_cpp_comment(comment.begin(), comment.end(), attr); | |
81 | ||
82 | std::cout << "Parsing a C++ comment"; | |
83 | if (r && attr == " This is a comment") | |
84 | std::cout << " succeeded." << std::endl; | |
85 | else | |
86 | std::cout << " failed" << std::endl; | |
87 | ||
88 | // C comment | |
89 | comment = "/* This is another comment */"; | |
90 | attr.clear(); | |
91 | r = client::parse_c_comment(comment.begin(), comment.end(), attr); | |
92 | ||
93 | std::cout << "Parsing a C comment"; | |
94 | if (r && attr == " This is another comment ") | |
95 | std::cout << " succeeded." << std::endl; | |
96 | else | |
97 | std::cout << " failed" << std::endl; | |
98 | ||
99 | // Tagged data | |
100 | std::string data = "<b> This is the body. </b>"; | |
101 | attr.clear(); | |
102 | ||
103 | r = client::parse_tagged(data.begin(), data.end(), attr); | |
104 | ||
105 | std::cout << "Parsing tagged data"; | |
106 | if (r && attr == "This is the body. ") | |
107 | std::cout << " succeeded." << std::endl; | |
108 | else | |
109 | std::cout << " failed" << std::endl; | |
110 | ||
111 | return 0; | |
112 | } | |
113 |