Tentando analisar instrução SQL como com o Boost-Spirit
Eu sou um novato em boost :: espírito. Eu escrevi o programa para analisar uma instrução SQL, como "select * from table where conditions". Compilar falhou. Um grande número de erros de modelo foi reportado. Então, alguém me ajudaria?
<code>#include <iostream> #include <string> #include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; struct db_select { void exec() {} std::string filed; std::string table; std::string condition; }; std::ostream& operator<<(std::ostream& os, const db_select& se) { return os << "filed: " << se.filed << " table: " << se.table << " condition: " << se.condition; } template <class Iterator> struct selecter : qi::grammar<Iterator, db_select (), ascii::space_type> { selecter() : selecter::base_type(se) { se %= "select" >> +qi::char_ << "from" << +qi::char_ << "where" << +qi::char_; } qi::rule<Iterator, db_select (), ascii::space_type> se; }; int main(int argc, char* argv[]) { if (argc < 2) return -1; std::string str(argv[1]); const char* first = str.c_str(); const char* last = &str[str.size()]; selecter<const char*> se; db_select rst; bool r = qi::phrase_parse(first, last, se, ascii::space, rst); if (!r || first != last) { std::cout << "parse failed, at: " << std::string(first, last) << std::endl; return -1; } else std::cout << "success, " << rst << std::endl; return 0; } </code>