fork(3) download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. #include <iostream>
  7. #include <string>
  8. #include <boost/config/warning_disable.hpp>
  9. #include <boost/spirit/include/qi.hpp>
  10. #include <boost/spirit/include/phoenix_core.hpp>
  11. #include <boost/spirit/include/phoenix_operator.hpp>
  12. #include <boost/spirit/include/phoenix_bind.hpp>
  13.  
  14. #include <stdio.h>
  15.  
  16. using namespace std;
  17.  
  18. namespace qi = boost::spirit::qi;
  19. namespace ascii = boost::spirit::ascii;
  20. namespace phoenix = boost::phoenix;
  21.  
  22. template <typename Iterator>
  23. struct my_grammar : boost::spirit::qi::grammar<Iterator, std::string(), ascii::space_type>
  24. {
  25.  
  26. my_grammar() : my_grammar::base_type(start)
  27. {
  28. using qi::alpha;
  29. using qi::alnum;
  30.  
  31. start %=
  32. (+alpha | +alnum)
  33. ;
  34. }
  35.  
  36. qi::rule<Iterator, std::string(), ascii::space_type> start;
  37. };
  38.  
  39. template <typename Iterator>
  40. bool my_Parse(Iterator first, Iterator last, std::string& result)
  41. {
  42. using boost::spirit::ascii::space;
  43.  
  44. my_grammar<std::string::const_iterator> g;
  45.  
  46. bool r = phrase_parse(first, last, g, space, result);
  47.  
  48. if (!r || first != last) // fail if we did not get a full match
  49. return false;
  50.  
  51. return r;
  52. }
  53.  
  54.  
  55.  
  56. int main() {
  57. std::string str;
  58. while (getline(std::cin, str))
  59. {
  60. string result = "";
  61. if (my_Parse(str.begin(), str.end(), result))
  62. {
  63. std::cout << "-------------------------\n";
  64. std::cout << "Parsing succeeded\n";
  65. std::cout << "got: " << result << std::endl;
  66. std::cout << "\n-------------------------\n";
  67. }
  68. else
  69. {
  70. std::cout << "-------------------------\n";
  71. std::cout << "Parsing failed\n";
  72. std::cout << "-------------------------\n";
  73. }
  74. }
  75. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
foobar
123foo
foo123
compilation info
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_);
                                                                        ^
stdout
Standard output is empty