// #define BOOST_SPIRIT_DEBUG
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
template <typename T> struct ChainLink;
template <typename T>
class SimpleLinkList {
public:
void push_back(T const& v) { /* todo */ _for_debug.push_back(v); }
std::list<int> _for_debug;
friend std::ostream& operator<<(std::ostream& os, SimpleLinkList const& list) {
os << "["; std::copy(list._for_debug.begin(), list._for_debug.end(), std::ostream_iterator<T>(os, " ")); return os << "]";
}
private:
ChainLink<T>* head;
};
namespace boost { namespace spirit { namespace traits {
template <typename T>
struct container_value<SimpleLinkList<T>, void> {
typedef T type;
};
template <typename T>
struct push_back_container<SimpleLinkList<T>, T, void> {
static bool call(SimpleLinkList<T>& c, T const& val) {
c.push_back(val);
return true;
}
};
}}}
struct AbstractDataType
{
int number;
SimpleLinkList<int> list1, list2;
};
BOOST_FUSION_ADAPT_STRUCT(AbstractDataType, (int, number)(SimpleLinkList<int>, list1)(SimpleLinkList<int>, list2))
template<typename Iterator>
struct parser_expression : qi::grammar<Iterator, AbstractDataType(), qi::space_type>
{
parser_expression() : parser_expression::base_type(start)
{
list = '[' >> -(qi::int_ % ',') >> ']';
start = qi::int_ >> list >> -list >> '=';
BOOST_SPIRIT_DEBUG_NODES((list)(start))
}
qi::rule<Iterator, AbstractDataType(), qi::space_type> start;
qi::rule<Iterator, SimpleLinkList<int>(), qi::space_type> list;
};
void test(const std::string input)
{
static const parser_expression<std::string::const_iterator> p;
AbstractDataType parsed;
auto f(input.begin()), l(input.end());
bool ok = qi::phrase_parse(f, l, p, qi::space, parsed);
if (ok)
std::cout << "Result: " << parsed.number << " " << parsed.list1 << parsed.list2 << "\n";
else
std::cout << "Parse failed\n";
if (f!=l)
std::cout << "Unparsed: '" << std::string(f,l) << "'\n";
}
int main()
{
test("1 [2, 3, 4] [5, 6] =");
test("2 [] [6, 7] =");
test("3 [4, 5, 6] [ ] =");
test("4 [5, 6, 7] =");
}
Ly8gI2RlZmluZSBCT09TVF9TUElSSVRfREVCVUcKI2luY2x1ZGUgPGJvb3N0L2Z1c2lvbi9hZGFwdGVkLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXguaHBwPgoKbmFtZXNwYWNlIHFpID0gYm9vc3Q6OnNwaXJpdDo6cWk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IENoYWluTGluazsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBTaW1wbGVMaW5rTGlzdCB7CiAgcHVibGljOgogICAgdm9pZCBwdXNoX2JhY2soVCBjb25zdCYgdikgeyAvKiB0b2RvICovIF9mb3JfZGVidWcucHVzaF9iYWNrKHYpOyB9CiAgICAKICAgIHN0ZDo6bGlzdDxpbnQ+IF9mb3JfZGVidWc7CiAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIFNpbXBsZUxpbmtMaXN0IGNvbnN0JiBsaXN0KSB7CiAgICAgICAgb3MgPDwgIlsiOyBzdGQ6OmNvcHkobGlzdC5fZm9yX2RlYnVnLmJlZ2luKCksIGxpc3QuX2Zvcl9kZWJ1Zy5lbmQoKSwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPFQ+KG9zLCAiICIpKTsgcmV0dXJuIG9zIDw8ICJdIjsKICAgIH0KICBwcml2YXRlOgogICAgQ2hhaW5MaW5rPFQ+KiBoZWFkOwp9OwoKbmFtZXNwYWNlIGJvb3N0IHsgbmFtZXNwYWNlIHNwaXJpdCB7IG5hbWVzcGFjZSB0cmFpdHMgewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgICAgc3RydWN0IGNvbnRhaW5lcl92YWx1ZTxTaW1wbGVMaW5rTGlzdDxUPiwgdm9pZD4gewogICAgICAgICAgICB0eXBlZGVmIFQgdHlwZTsKICAgICAgICB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgICAgIHN0cnVjdCBwdXNoX2JhY2tfY29udGFpbmVyPFNpbXBsZUxpbmtMaXN0PFQ+LCBULCB2b2lkPiB7CiAgICAgICAgICAgIHN0YXRpYyBib29sIGNhbGwoU2ltcGxlTGlua0xpc3Q8VD4mIGMsIFQgY29uc3QmIHZhbCkgewogICAgICAgICAgICAgICAgYy5wdXNoX2JhY2sodmFsKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKfX19CgpzdHJ1Y3QgQWJzdHJhY3REYXRhVHlwZQp7CiAgICBpbnQgbnVtYmVyOwogICAgU2ltcGxlTGlua0xpc3Q8aW50PiBsaXN0MSwgbGlzdDI7Cn07CgpCT09TVF9GVVNJT05fQURBUFRfU1RSVUNUKEFic3RyYWN0RGF0YVR5cGUsIChpbnQsIG51bWJlcikoU2ltcGxlTGlua0xpc3Q8aW50PiwgbGlzdDEpKFNpbXBsZUxpbmtMaXN0PGludD4sIGxpc3QyKSkKCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgpzdHJ1Y3QgcGFyc2VyX2V4cHJlc3Npb24gOiBxaTo6Z3JhbW1hcjxJdGVyYXRvciwgQWJzdHJhY3REYXRhVHlwZSgpLCBxaTo6c3BhY2VfdHlwZT4gCnsKICAgIHBhcnNlcl9leHByZXNzaW9uKCkgOiBwYXJzZXJfZXhwcmVzc2lvbjo6YmFzZV90eXBlKHN0YXJ0KSAKICAgIHsKICAgICAgICBsaXN0ICA9ICdbJyA+PiAtKHFpOjppbnRfICUgJywnKSA+PiAnXSc7CiAgICAgICAgc3RhcnQgPSBxaTo6aW50XyA+PiBsaXN0ID4+IC1saXN0ID4+ICc9JzsKCiAgICAgICAgQk9PU1RfU1BJUklUX0RFQlVHX05PREVTKChsaXN0KShzdGFydCkpCiAgICB9CgogICAgcWk6OnJ1bGU8SXRlcmF0b3IsIEFic3RyYWN0RGF0YVR5cGUoKSwgICAgcWk6OnNwYWNlX3R5cGU+IHN0YXJ0OwogICAgcWk6OnJ1bGU8SXRlcmF0b3IsIFNpbXBsZUxpbmtMaXN0PGludD4oKSwgcWk6OnNwYWNlX3R5cGU+IGxpc3Q7Cn07Cgp2b2lkIHRlc3QoY29uc3Qgc3RkOjpzdHJpbmcgaW5wdXQpCnsKICAgIHN0YXRpYyBjb25zdCBwYXJzZXJfZXhwcmVzc2lvbjxzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHA7CgogICAgQWJzdHJhY3REYXRhVHlwZSBwYXJzZWQ7CiAgICBhdXRvIGYoaW5wdXQuYmVnaW4oKSksIGwoaW5wdXQuZW5kKCkpOwogICAgYm9vbCBvayA9IHFpOjpwaHJhc2VfcGFyc2UoZiwgbCwgcCwgcWk6OnNwYWNlLCBwYXJzZWQpOwoKICAgIGlmIChvaykKICAgICAgICBzdGQ6OmNvdXQgPDwgIlJlc3VsdDogIiA8PCBwYXJzZWQubnVtYmVyIDw8ICIgIiA8PCBwYXJzZWQubGlzdDEgPDwgcGFyc2VkLmxpc3QyIDw8ICJcbiI7CiAgICBlbHNlCiAgICAgICAgc3RkOjpjb3V0IDw8ICJQYXJzZSBmYWlsZWRcbiI7CgogICAgaWYgKGYhPWwpCiAgICAgICAgc3RkOjpjb3V0IDw8ICJVbnBhcnNlZDogJyIgPDwgc3RkOjpzdHJpbmcoZixsKSA8PCAiJ1xuIjsKfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCIxIFsyLCAzLCA0XSBbNSwgNl0gPSIpOwogICAgdGVzdCgiMiBbXSAgICAgICAgWzYsIDddID0iKTsKICAgIHRlc3QoIjMgWzQsIDUsIDZdIFsgICAgXSA9Iik7CiAgICB0ZXN0KCI0IFs1LCA2LCA3XSAgICAgICAgPSIpOwp9Cg==