c++ parsing boost boost-spirit boost-spirit-qi

c++ - ¿Cómo puedo usar el skipper ascii:: space SIN omitir eol?



parsing boost (1)

La respuesta más simple es

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank);

Por supuesto, también depende de tu gramática: si espera una clase de patrón específica, es posible que tengas que cambiar eso. Vea a continuación una forma genérica de manejar eso (aunque podría simplemente especificar qi::blank_type para una Gramática que solo debería aceptar qi::blank ).

La muestra maneja patrones también arbitrarios.

Otros consejos

Spirit tiene varias directivas que influyen en el uso de skippers:

  • qi::lexeme

    analizará la sub-expresión independientemente del patrón (útil para, por ejemplo, literales de cadena en una gramática)

  • qi::raw

    devolverá el rango del iterador de fuente sin formato, lo que significa que la entrada omitida se incluirá en el resultado

  • qi::no_skip , qi::skip

    se puede usar para cambiar explícitamente el tipo de patrón utilizado para la subexpresión

Lectura recomendada

El sitio de Boost Spirit tiene un buen artículo sobre cosas como esta

Muestra genérica

#include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; template <typename It, typename Skipper> struct parser : qi::grammar<It, Skipper> { parser() : parser::base_type(start) { start = *qi::int_; } private: qi::rule<It, Skipper> start; }; template <typename C, typename Skipper> void doParse(const C& input, const Skipper& skipper) { auto f(std::begin(input)), l(std::end(input)); parser<decltype(f), Skipper> p; bool ok = qi::phrase_parse(f,l,p,skipper); if (ok) std::cout << "parse success/n"; } int main() { const std::string input = "1 2 3 4"; doParse(input, qi::blank); doParse(input, qi::space); doParse(input, ~qi::char_("0-9")); }

Tengo que usar boost :: spirit para analizar, y quiero usar la función phrase_parse:

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);

Pero el cuarto término (ascii :: space - qi :: eol) no está permitido por mi compilador. ¿Cómo puedo usar el skipper ascii :: space SIN omitir eol?