c++ boost boost-spirit boost-spirit-x3

c++ - boost:: spirit:: x3 ¿reglas de compatibilidad de atributos, intuición o código?



boost-spirit boost-spirit-x3 (1)

Si no estás en la rama de desarrollo, no tienes la solución para esa falla de adaptación de secuencia de elemento único, entonces sí, probablemente sea eso.

Debido a la genérica de la transformación / propagación de atributos, hay mucho margen de maniobra, pero, por supuesto, está documentado y, en última instancia, en el código. En otras palabras: no hay magia.

En los días del Qi, habría "arreglado" esto simplemente deletreando la transformación deseada con qi::as<> o qi::attr_cast<> . X3 no lo tiene (todavía), pero puedes usar una regla para imitarlo muy fácilmente:

Live On Coliru

#include <iostream> #include <boost/fusion/adapted/struct.hpp> #include <boost/spirit/home/x3.hpp> namespace x3 = boost::spirit::x3; struct Name { std::string value; }; BOOST_FUSION_ADAPT_STRUCT(Name, value) int main() { std::string const input = "Halleo123_1"; Name out; bool ok = x3::parse(input.begin(), input.end(), x3::rule<struct _, std::string>{} = x3::alpha >> *(x3::alnum | x3::char_(''_'')), out); if (ok) std::cout << "Parsed: " << out.value << "/n"; else std::cout << "Parse failed/n"; }

Huellas dactilares:

Parsed: Halleo123_1

Automatizarlo

Debido a que X3 funciona muy bien con las funciones de lenguaje central de C ++ 14, no es difícil reducir el tipeo:

Comprender el operador de listas (%) en Boost.Spirit

¿Hay algún documento en alguna parte que describa cómo varias operaciones de definición de reglas spirit :: x3 afectan la compatibilidad de atributos?

Me sorprendió cuando:

x3::lexeme[ x3::alpha > *(x3::alnum | x3::char_(''_'')) ]

no se pudo mover a una estructura adaptada a la fusión:

struct Name { std::string value; };

Por el momento, me deshice del primer carácter alfabético obligatorio, pero aún me gustaría expresar una regla que defina que el nombre de la cadena debe comenzar con una letra. ¿Es esta una de esas situaciones en las que debo intentar agregar los eps hasta que funcione, o hay una razón explícita por la cual lo anterior no pudo funcionar?

Me disculpo si esto ha sido escrito en alguna parte, no pude encontrarlo.