1 /*=============================================================================
2 Copyright (c) 2010-2011 Daniel James
4 Use, modification and distribution is subject to the Boost Software
5 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
9 #if !defined(BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP)
10 #define BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP
13 #include "parsers.hpp"
15 #include <boost/spirit/include/phoenix1_functions.hpp>
20 namespace ph = phoenix;
22 struct value_builder_save : scoped_action_base
24 explicit value_builder_save(value_builder& builder_) : builder(builder_) {}
32 void cleanup() { builder.restore(); }
34 value_builder& builder;
37 value_builder_save& operator=(value_builder_save const&);
40 struct value_builder_list : scoped_action_base
42 explicit value_builder_list(value_builder& builder_) : builder(builder_) {}
44 bool start(value::tag_type tag = value::default_tag)
46 builder.start_list(tag);
50 void success(parse_iterator, parse_iterator) { builder.finish_list(); }
51 void failure() { builder.clear_list(); }
53 value_builder& builder;
56 value_builder_list& operator=(value_builder_list const&);
61 template <typename Arg1, typename Arg2 = void, typename Arg3 = void, typename Arg4 = void>
66 explicit value_entry(value_builder& builder_, file_ptr* current_file_)
67 : builder(builder_), current_file(current_file_) {}
69 void operator()(parse_iterator begin, parse_iterator end,
70 value::tag_type tag = value::default_tag) const
72 builder.insert(qbk_value(*current_file, begin.base(), end.base(), tag));
75 void operator()(int v,
76 value::tag_type tag = value::default_tag) const
78 builder.insert(int_value(v, tag));
81 value_builder& builder;
82 file_ptr* current_file;
85 value_entry& operator=(value_entry const&);
90 typedef void result_type;
92 explicit value_sort(value_builder& builder_)
93 : builder(builder_) {}
95 void operator()() const {
99 value_builder& builder;
102 value_sort& operator=(value_sort const&);
107 explicit value_parser(file_ptr* current_file)
109 , save(value_builder_save(builder))
110 , list(value_builder_list(builder))
111 , entry(value_entry(builder, current_file))
112 , sort(value_sort(builder))
115 value release() { return builder.release(); }
117 value_builder builder;
118 scoped_parser<value_builder_save> save;
119 scoped_parser<value_builder_list> list;
120 ph::function<value_entry> entry;
121 ph::function<value_sort> sort;