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>
parse_cpp_comment(Iterator first,Iterator last,std::string & attr)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>
parse_c_comment(Iterator first,Iterator last,std::string & attr)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>
parse_tagged(Iterator first,Iterator last,std::string & attr)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
main()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
114