estoy entre una profunda admiración sobre el impulso :: espíritu y la frustración eterna no entenderla;)espíritu Boost es demasiado codicioso
tengo problemas con las cadenas que son demasiado codiciosos y por lo tanto no coincide . Debajo de un ejemplo mínimo que no analiza, ya que la regla txt consume el final.
Más información acerca de lo que me gustaría hacer: el objetivo es analizar algunos pseudo-SQL y saltar espacios en blanco. En una declaración como
select foo.id, bar.id from foo, baz
que necesito para tratar from
como palabra clave especial. La regla es algo así como
"select" >> txt % ',' >> "from" >> txt % ','
pero es evidente que no funciona en bar.id from foo
ve como un solo elemento.
#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;
}
Gracias! Este lexema era lo que me estaba perdiendo. Usted estaba completamente derecho de agregar espacios (los dejé en el ejemplo tratando de tener algo mínimo, pero supongo que era más confuso que nada) –
golpe de suerte;) Gracias. – phooji