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:
-
analizará la sub-expresión independientemente del patrón (útil para, por ejemplo, literales de cadena en una gramática)
-
devolverá el rango del iterador de fuente sin formato, lo que significa que la entrada omitida se incluirá en el resultado
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?