1 /*============================================================================= 2 Copyright (c) 2010-2011 Daniel James 3 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 =============================================================================*/ 8 9 #if !defined(BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP) 10 #define BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP 11 12 #include "values.hpp" 13 #include "parsers.hpp" 14 #include "scoped.hpp" 15 #include <boost/spirit/include/phoenix1_functions.hpp> 16 17 #include <iostream> 18 19 namespace quickbook { 20 namespace ph = phoenix; 21 22 struct value_builder_save : scoped_action_base 23 { value_builder_savequickbook::value_builder_save24 value_builder_save(value_builder& builder) : builder(builder) {} 25 startquickbook::value_builder_save26 bool start() 27 { 28 builder.save(); 29 return true; 30 } 31 cleanupquickbook::value_builder_save32 void cleanup() { builder.restore(); } 33 34 value_builder& builder; 35 }; 36 37 struct value_builder_list : scoped_action_base 38 { value_builder_listquickbook::value_builder_list39 value_builder_list(value_builder& builder) : builder(builder) {} 40 startquickbook::value_builder_list41 bool start(value::tag_type tag = value::default_tag) 42 { 43 builder.start_list(tag); 44 return true; 45 } 46 successquickbook::value_builder_list47 void success(parse_iterator, parse_iterator) { builder.finish_list(); } failurequickbook::value_builder_list48 void failure() { builder.clear_list(); } 49 50 value_builder& builder; 51 }; 52 53 struct value_entry 54 { 55 template <typename Arg1, typename Arg2 = void, typename Arg3 = void, typename Arg4 = void> 56 struct result { 57 typedef void type; 58 }; 59 value_entryquickbook::value_entry60 value_entry(value_builder& b, file_ptr* current_file) 61 : b(b), current_file(current_file) {} 62 operator ()quickbook::value_entry63 void operator()(parse_iterator begin, parse_iterator end, 64 value::tag_type tag = value::default_tag) const 65 { 66 b.insert(qbk_value(*current_file, begin.base(), end.base(), tag)); 67 } 68 operator ()quickbook::value_entry69 void operator()(int v, 70 value::tag_type tag = value::default_tag) const 71 { 72 b.insert(int_value(v, tag)); 73 } 74 75 value_builder& b; 76 file_ptr* current_file; 77 }; 78 79 struct value_sort 80 { 81 typedef void result_type; 82 value_sortquickbook::value_sort83 value_sort(value_builder& b) 84 : b(b) {} 85 operator ()quickbook::value_sort86 void operator()() const { 87 b.sort_list(); 88 } 89 90 value_builder& b; 91 }; 92 93 struct value_parser 94 { value_parserquickbook::value_parser95 value_parser(file_ptr* current_file) 96 : builder() 97 , save(builder) 98 , list(builder) 99 , entry(value_entry(builder, current_file)) 100 , sort(builder) 101 {} 102 releasequickbook::value_parser103 value release() { return builder.release(); } 104 105 value_builder builder; 106 scoped_parser<value_builder_save> save; 107 scoped_parser<value_builder_list> list; 108 ph::function<value_entry> entry; 109 ph::function<value_sort> sort; 110 }; 111 } 112 113 #endif 114