]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/repository/example/qi/flush_multi_pass.cpp
1 // Copyright (c) 2001-2010 Hartmut Kaiser
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)
6 // The purpose of this example is to demonstrate a simple use case for the
7 // flush_multi_pass parser.
13 //[qi_flush_multi_pass_includes
14 #include <boost/spirit/include/qi.hpp>
15 #include <boost/spirit/repository/include/qi_flush_multi_pass.hpp>
18 //[qi_flush_multi_pass_namespace
19 namespace spirit
= boost::spirit
;
20 using boost::spirit::repository::flush_multi_pass
;
25 //[qi_flush_multi_pass_clear_buffer
26 template <typename Iterator
, typename Skipper
>
27 struct preprocessor
: spirit::qi::grammar
<Iterator
, Skipper
>
29 // This is a simplified preprocessor grammar recognizing
31 // #define MACRONAME something
34 // Its sole purpose is to show an example how to use the
35 // flush_multi_pass parser. At the end of each line no backtracking can
36 // occur anymore so that it's safe to clear all internal buffers in the
38 preprocessor() : preprocessor::base_type(file
)
40 using spirit::ascii::char_
;
41 using spirit::qi::eol
;
42 using spirit::qi::lit
;
48 line
= ( command
| *(char_
- eol
) )
54 "#define" >> *lit(' ') >> *(char_
- ' ') >> *lit(' ') >> *(char_
- eol
)
55 | "#undef" >> *lit(' ') >> *(char_
- eol
)
59 spirit::qi::rule
<Iterator
, Skipper
> file
, line
, command
;
64 template <typename Iterator
, typename Skipper
>
65 bool parse(Iterator
& first
, Iterator end
, Skipper
const& skipper
)
67 client::preprocessor
<Iterator
, Skipper
> g
;
68 return boost::spirit::qi::phrase_parse(first
, end
, g
, skipper
);
73 namespace spirit
= boost::spirit
;
74 using spirit::ascii::char_
;
75 using spirit::qi::eol
;
77 std::ifstream
in("flush_multi_pass.txt"); // we get our input from this file
79 std::cout
<< "Could not open input file: 'flush_multi_pass.txt'" << std::endl
;
83 typedef std::istreambuf_iterator
<char> base_iterator_type
;
84 spirit::multi_pass
<base_iterator_type
> first
=
85 spirit::make_default_multi_pass(base_iterator_type(in
));
86 spirit::multi_pass
<base_iterator_type
> end
=
87 spirit::make_default_multi_pass(base_iterator_type());
89 bool result
= parse(first
, end
, '#' >> *(char_
- eol
) >> eol
);
91 std::cout
<< "Failed parsing input file!" << std::endl
;
95 std::cout
<< "Successfully parsed input file!" << std::endl
;