Я испытываю глубокое восхищение по поводу boost :: spirit и вечного разочарования, чтобы не понять этого;)
У меня проблемы со строками, которые слишком жадны и поэтому они не совпадают . Ниже приведен минимальный пример, который не анализируется по мере того, как правило txt "съедает".
Дополнительная информация о том, что я хотел бы сделать: цель состоит в том, чтобы проанализировать некоторый псевдо-SQL, и я пропускаю пробелы. В операторе вроде
select foo.id, bar.id from foo, baz
мне нужно рассматривать из
как особое ключевое слово. Это правило похоже на
"select" >> txt % ',' >> "from" >> txt % ','
, но оно явно не работает, поскольку видит bar.id из foo
как один элемент.
#include <boost/spirit/include/qi.hpp>
#include <iostream>
namespace qi = boost::spirit::qi;
int main(int, char**) {
auto txt = +(qi::char_("a-zA-Z_"));
auto rule = qi::lit("Hello") >> txt % ',' >> "end";
std::string str = "HelloFoo,Moo,Bazend";
std::string::iterator begin = str.begin();
if (qi::parse(begin, str.end(), rule))
std::cout << "Match !" << std::endl;
else
std::cout << "No match :'(" << std::endl;
}