1
// Copyright (c) 2005 Carl Barron. Distributed under the Boost
2
// Software License, Version 1.0. (See accompanying file
3
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
#define BOOST_SPIRIT_DEBUG
8
#ifndef BOOST_SPIRIT_CLOSURE_LIMIT
9
#define BOOST_SPIRIT_CLOSURE_LIMIT 10
13
#define PHOENIX_LIMIT 10
16
#if BOOST_SPIRIT_CLOSURE_LIMIT < 6
17
#undef BOOST_SPIRIT_CLOSURE_LIMIT
18
#define BOOST_SPIRIT_CLOSURE_LIMIT 6
21
#if PHOENIX_LIMIT < BOOST_SPIRIT_CLOSURE_LIMIT
23
#define PHOENIX_LIMIT BOOST_SPIRIT_CLOSURE_LIMIT
27
#ifdef BOOST_SPIRIT_DEBUG_FLAGS
28
#undef BOOST_SPIRIT_DEBUG_FLAGS
30
#define BOOST_SPIRIT_DEBUG_FLAGS (BOOST_SPIRIT_DEBUG_FLAGS_MAX - BOOST_SPIRIT_DEBUG_FLAGS_CLOSURES)
33
#include <boost/spirit/include/classic_core.hpp>
34
#include <boost/spirit/include/classic_attribute.hpp>
35
#include <boost/spirit/include/phoenix1.hpp>
37
#include "actions.hpp"
38
#include <boost/variant.hpp>
43
namespace SP = BOOST_SPIRIT_CLASSIC_NS;
46
using phoenix::construct_;
49
struct str_cls:SP::closure<str_cls,std::string>
52
struct attrib_cls:SP::closure
55
std::pair<std::string,std::string>,
65
struct tagged_cls:SP::closure
70
std::map<std::string,std::string>,
71
std::list<typename tag::variant_type>
80
struct xml_g:SP::grammar<xml_g>
83
xml_g(std::list<tag> &a):tags(a){}
87
definition(const xml_g &s)
97
[store_tag(tagged.value,tagged.ID,tagged.attribs,
101
end_tag = SP::str_p("</")
102
>> SP::f_str_p(tagged.ID)
107
| str) [push_child(tagged.children,arg1)]
110
str = SP::lexeme_d[+(SP::anychar_p - '<')]
111
[str.value=construct_<std::string>(arg1,arg2)]
115
[push_back(var(s.tags),arg1)]
118
starter = SP::ch_p('<')
119
>> SP::lexeme_d[+SP::alpha_p]
120
[tagged.ID = construct_<std::string>(arg1,arg2)]
122
[store_in_map(tagged.attribs,arg1)]
129
simple_start_tag = starter
134
>>SP::lexeme_d[+SP::alpha_p]
135
[attrib.first = construct_<std::string>(arg1,arg2)]
140
>> SP::lexeme_d[+(SP::anychar_p - '"')]
141
[attrib.second = construct_<std::string>(arg1,arg2)]
143
[attrib.value = construct_
150
>(attrib.first,attrib.second)]
152
BOOST_SPIRIT_DEBUG_RULE(tagged);
153
BOOST_SPIRIT_DEBUG_RULE(end_tag);
154
BOOST_SPIRIT_DEBUG_RULE(inner);
155
BOOST_SPIRIT_DEBUG_RULE(str);
156
BOOST_SPIRIT_DEBUG_RULE(top);
157
BOOST_SPIRIT_DEBUG_RULE(start_tag);
158
BOOST_SPIRIT_DEBUG_RULE(attrib);
159
BOOST_SPIRIT_DEBUG_RULE(white);
160
BOOST_SPIRIT_DEBUG_RULE(starter);
161
BOOST_SPIRIT_DEBUG_RULE(simple_start_tag);
165
push_back_f push_back;
166
push_child_f push_child;
167
store_in_map_f store_in_map;
168
store_tag_f store_tag;
170
SP::rule<Scan,tagged_cls::context_t> tagged;
171
SP::rule<Scan> end_tag;
172
SP::rule<Scan> inner;
173
SP::rule<Scan,str_cls::context_t> str;
175
SP::rule<Scan> starter;
176
SP::rule<Scan> simple_start_tag;
177
SP::rule<Scan> start_tag;
178
SP::rule<Scan> white;
179
SP::rule<Scan,attrib_cls::context_t> attrib;
180
SP::rule<Scan> const &start() const