#include <iostream>
#include <string>
using namespace std;
#include <iostream>
#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <stdio.h>
using namespace std;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;
template <typename Iterator>
struct my_grammar : boost::spirit::qi::grammar<Iterator, std::string(), ascii::space_type>
{
my_grammar() : my_grammar::base_type(start)
{
using qi::alpha;
using qi::alnum;
start %=
(+alpha | +alnum)
;
}
qi::rule<Iterator, std::string(), ascii::space_type> start;
};
template <typename Iterator>
bool my_Parse(Iterator first, Iterator last, std::string& result)
{
using boost::spirit::ascii::space;
my_grammar<std::string::const_iterator> g;
bool r = phrase_parse(first, last, g, space, result);
if (!r || first != last) // fail if we did not get a full match
return false;
return r;
}
int main() {
std::string str;
while (getline(std::cin, str))
{
string result = "";
if (my_Parse(str.begin(), str.end(), result))
{
std::cout << "-------------------------\n";
std::cout << "Parsing succeeded\n";
std::cout << "got: " << result << std::endl;
std::cout << "\n-------------------------\n";
}
else
{
std::cout << "-------------------------\n";
std::cout << "Parsing failed\n";
std::cout << "-------------------------\n";
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy93YXJuaW5nX2Rpc2FibGUuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcWkuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9jb3JlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfb3BlcmF0b3IuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9iaW5kLmhwcD4KCiNpbmNsdWRlIDxzdGRpby5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCm5hbWVzcGFjZSBxaSA9IGJvb3N0OjpzcGlyaXQ6OnFpOwpuYW1lc3BhY2UgYXNjaWkgPSBib29zdDo6c3Bpcml0Ojphc2NpaTsKbmFtZXNwYWNlIHBob2VuaXggPSBib29zdDo6cGhvZW5peDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4Kc3RydWN0IG15X2dyYW1tYXIgOiBib29zdDo6c3Bpcml0OjpxaTo6Z3JhbW1hcjxJdGVyYXRvciwgc3RkOjpzdHJpbmcoKSwgYXNjaWk6OnNwYWNlX3R5cGU+CnsKCglteV9ncmFtbWFyKCkgOiBteV9ncmFtbWFyOjpiYXNlX3R5cGUoc3RhcnQpCgl7CgkJdXNpbmcgcWk6OmFscGhhOwoJCXVzaW5nIHFpOjphbG51bTsKCgkJc3RhcnQgJT0KCQkJKCthbHBoYSB8ICthbG51bSkKCQkJOwoJfQoKCXFpOjpydWxlPEl0ZXJhdG9yLCBzdGQ6OnN0cmluZygpLCBhc2NpaTo6c3BhY2VfdHlwZT4gc3RhcnQ7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CmJvb2wgbXlfUGFyc2UoSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGxhc3QsIHN0ZDo6c3RyaW5nJiByZXN1bHQpCnsKCXVzaW5nIGJvb3N0OjpzcGlyaXQ6OmFzY2lpOjpzcGFjZTsKCglteV9ncmFtbWFyPHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gZzsKCglib29sIHIgPSBwaHJhc2VfcGFyc2UoZmlyc3QsIGxhc3QsIGcsIHNwYWNlLCByZXN1bHQpOwoKCWlmICghciB8fCBmaXJzdCAhPSBsYXN0KSAvLyBmYWlsIGlmIHdlIGRpZCBub3QgZ2V0IGEgZnVsbCBtYXRjaAoJCXJldHVybiBmYWxzZTsKCQoJcmV0dXJuIHI7Cn0KCgoKaW50IG1haW4oKSB7CglzdGQ6OnN0cmluZyBzdHI7Cgl3aGlsZSAoZ2V0bGluZShzdGQ6OmNpbiwgc3RyKSkKCXsKCQlzdHJpbmcgcmVzdWx0ID0gIiI7CgkJaWYgKG15X1BhcnNlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIHJlc3VsdCkpCgkJewoJCQlzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CgkJCXN0ZDo6Y291dCA8PCAiUGFyc2luZyBzdWNjZWVkZWRcbiI7CgkJCXN0ZDo6Y291dCA8PCAiZ290OiAiIDw8IHJlc3VsdCA8PCBzdGQ6OmVuZGw7CgkJCXN0ZDo6Y291dCA8PCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwoJCX0KCQllbHNlCgkJewoJCQlzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CgkJCXN0ZDo6Y291dCA8PCAiUGFyc2luZyBmYWlsZWRcbiI7CgkJCXN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKCQl9Cgl9Cn0=
In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
from /usr/include/boost/spirit/home/qi.hpp:20,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:9:
/usr/include/boost/spirit/home/qi/reference.hpp: In instantiation of 'bool boost::spirit::qi::reference<Subject>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Context = boost::spirit::context<boost::fusion::cons<std::basic_string<char>&, boost::fusion::nil_>, boost::spirit::locals<> >; Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >; Attribute = std::basic_string<char>; Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>]':
/usr/include/boost/spirit/home/qi/parse.hpp:164:13: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, boost::spirit::qi::skip_flag::enum_type, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = my_grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; Attr = std::basic_string<char>]'
/usr/include/boost/spirit/home/qi/parse.hpp:197:86: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = my_grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; Attr = std::basic_string<char>]'
prog.cpp:46:53: required from 'bool my_Parse(Iterator, Iterator, std::string&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; std::string = std::basic_string<char>]'
prog.cpp:61:46: required from here
/usr/include/boost/spirit/home/qi/reference.hpp:43:72: error: no matching function for call to 'boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>::parse(__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<std::basic_string<char>&, boost::fusion::nil_>, boost::spirit::locals<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >&, std::basic_string<char>&) const'
return ref.get().parse(first, last, context, skipper, attr_);
^
/usr/include/boost/spirit/home/qi/reference.hpp:43:72: note: candidates are:
In file included from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14:0,
from /usr/include/boost/spirit/home/qi.hpp:20,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:9:
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:273:14: note: template<class Context, class Skipper, class Attribute> bool boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Context = Context; Skipper = Skipper; Attribute = Attribute; Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; T1 = std::basic_string<char>(); T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]
bool parse(Iterator& first, Iterator const& last
^
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:273:14: note: template argument deduction/substitution failed:
In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
from /usr/include/boost/spirit/home/qi.hpp:20,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:9:
/usr/include/boost/spirit/home/qi/reference.hpp:43:72: note: cannot convert 'first' (type '__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >') to type '__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&'
return ref.get().parse(first, last, context, skipper, attr_);
^
In file included from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14:0,
from /usr/include/boost/spirit/home/qi.hpp:20,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:9:
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:319:14: note: template<class Context, class Skipper, class Attribute, class Params> bool boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&, const Params&) const [with Context = Context; Skipper = Skipper; Attribute = Attribute; Params = Params; Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >; T1 = std::basic_string<char>(); T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]
bool parse(Iterator& first, Iterator const& last
^
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:319:14: note: template argument deduction/substitution failed:
In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
from /usr/include/boost/spirit/home/qi.hpp:20,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:9:
/usr/include/boost/spirit/home/qi/reference.hpp:43:72: note: cannot convert 'first' (type '__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >') to type '__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&'
return ref.get().parse(first, last, context, skipper, attr_);
^