// spirit-test.cpp : Defines the entry point for the console application.
//
#include <string>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/spirit/include/support_ascii.hpp>
namespace qi = boost::spirit::qi;
namespace fusion = boost::fusion;
namespace phoenix = boost::phoenix;
void getstr(std::string& str)
{
std::cout << str;
return ;
}
template <typename Iterator >
bool parse (Iterator begin, Iterator end)
{
using qi::lexeme;
using qi::char_;
using qi::lit;
using qi::rule;
using qi::space;
using boost::spirit::no_skip;
using boost::spirit::ascii::space_type;
rule<Iterator> Sequence;
rule<Iterator, std::string()> KeyName, Value, ValueExpression;
KeyName
%= no_skip[+char_("a-zA-Z0-9_") >> lit("=")]
;
Value
%= +(char_ - char_("{="))
;
ValueExpression
%= (
Value
>> *space
>> &(KeyName | lit("{"))
)
;
Sequence
=
+( KeyName[boost::bind(&getstr, _1)]
>> ValueExpression[boost::bind(&getstr, _1)]
)
;
bool r = qi::phrase_parse(begin, end, Sequence, space);
if (!r || begin != end) { return false; }
else return true;
}
int main ()
{
std::string test(" ARG=Test still in first ARG ARG2=Zombie cat EXP2=FunctionCall(A, B C) {" );
bool status = parse<std::string::const_iterator> (test.begin(), test.end());
return 0;
}
Ly8gc3Bpcml0LXRlc3QuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgovLwoKI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaS5ocHA+CiNpbmNsdWRlIDxib29zdC9pdGVyYXRvci9pdGVyYXRvcl9mYWNhZGUuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvc3VwcG9ydF9hc2NpaS5ocHA+CgoKbmFtZXNwYWNlIHFpID0gYm9vc3Q6OnNwaXJpdDo6cWk7Cm5hbWVzcGFjZSBmdXNpb24gPSBib29zdDo6ZnVzaW9uOwpuYW1lc3BhY2UgcGhvZW5peCA9IGJvb3N0OjpwaG9lbml4OwoKdm9pZCBnZXRzdHIoc3RkOjpzdHJpbmcmIHN0cikgCnsKICAgIHN0ZDo6Y291dCA8PCBzdHI7CiAgICByZXR1cm4gOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3IgPgpib29sIHBhcnNlIChJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQp7CiAgICB1c2luZyBxaTo6bGV4ZW1lOwogICAgdXNpbmcgcWk6OmNoYXJfOwogICAgdXNpbmcgcWk6OmxpdDsKICAgIHVzaW5nIHFpOjpydWxlOwogICAgdXNpbmcgcWk6OnNwYWNlOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6bm9fc2tpcDsKICAgIHVzaW5nIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOjpzcGFjZV90eXBlOwogICAgCiAgICAKICAgIAogICAgcnVsZTxJdGVyYXRvcj4gU2VxdWVuY2U7CiAgICBydWxlPEl0ZXJhdG9yLCBzdGQ6OnN0cmluZygpPiBLZXlOYW1lLCBWYWx1ZSwgVmFsdWVFeHByZXNzaW9uOwogICAgICAgIAogICAgCiAgICBLZXlOYW1lCiAgICAgICAgJT0gbm9fc2tpcFsrY2hhcl8oImEtekEtWjAtOV8iKSA+PiBsaXQoIj0iKV0KICAgICAgICA7CgogICAgVmFsdWUKICAgICAgICAlPSAgKyhjaGFyXyAtIGNoYXJfKCJ7PSIpKSAKICAgICAgICA7CgogICAgVmFsdWVFeHByZXNzaW9uIAogICAgICAgICU9ICggCiAgICAgICAgVmFsdWUgIAogICAgICAgID4+ICpzcGFjZSAKICAgICAgICA+PiAmKEtleU5hbWUgfCBsaXQoInsiKSkKICAgICAgICApCiAgICAgICAgOwoKICAgIFNlcXVlbmNlCiAgICAgICAgPQkKICAgICAgICArKCAgS2V5TmFtZVtib29zdDo6YmluZCgmZ2V0c3RyLCBfMSldCiAgICAgICAgICAgID4+IFZhbHVlRXhwcmVzc2lvbltib29zdDo6YmluZCgmZ2V0c3RyLCBfMSldCiAgICAgICAgKSAgCiAgICAgICAgOwoKICAgIGJvb2wgciA9ICBxaTo6cGhyYXNlX3BhcnNlKGJlZ2luLCBlbmQsIFNlcXVlbmNlLCBzcGFjZSk7CiAgICBpZiAoIXIgfHwgYmVnaW4gIT0gZW5kKSB7IHJldHVybiBmYWxzZTsgfQogICAgZWxzZSByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4gKCkKewogICAgc3RkOjpzdHJpbmcgdGVzdCgiIEFSRz1UZXN0IHN0aWxsIGluIGZpcnN0IEFSRyBBUkcyPVpvbWJpZSBjYXQgRVhQMj1GdW5jdGlvbkNhbGwoQSwgQiBDKSB7IiApOwogICAgYm9vbCBzdGF0dXMgPSBwYXJzZTxzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICh0ZXN0LmJlZ2luKCksIHRlc3QuZW5kKCkpOwogICAgcmV0dXJuIDA7Cn0=