Al igual que muchas de estas otras preguntas, estoy tratando de analizar una gramática simple en un árbol de estructuras usando Boost.Spirit.Qi.Boost.Spirit.Qi: ¿Toma el atributo de una regla y lo establece como un campo del atributo de estructura de una regla circundante?
Trataré de destilar lo que estoy tratando de hacer con el caso más simple posible. Tengo:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
Más tarde, en el interior de una estructura gramatical, tengo la siguiente variable miembro:
qi::rule<Iterator, Integer> integer;
la que estoy definiendo con
integer = qi::int_;
cuando trato de analizar realidad un entero, sin embargo, usando
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value
siempre se desinicializa después de un análisis correcto. Del mismo modo, me han tratado las siguientes definiciones (obviamente los que no compilan están equivocados):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
Claramente estoy mal entendido algo de alcohol, Phoenix, o alguna otra cosa. Mi entendimiento es que qi::_1
es el primer atributo de qi::int_
, aquí, y debe representar el entero analizado, cuando la parte entre corchetes se ejecuta como un objeto de función. Entonces estoy suponiendo que el objeto de función tomará el atributo integer
adjunto qi::_val
e intentará asignarle el entero analizado. Supongo que debido a mi llamada BOOST_FUSION_ADAPT_STRUCT
, las dos serían compatibles, y ciertamente parece ser el caso desde una perspectiva de análisis estático, pero los datos no se conservan.
¿Existe una designación de referencia (&) que me falta en algún lado o algo así?
acabo de encontrar otra combinación que compila, a pesar de que no se traduce en datos inicializados: He añadido un constructor de 'Integer' que toma un valor de' valor' , luego definí mi analizador 'entero 'como' integer = qi :: long_long [qi :: _ val = phx :: constructo (qi :: _ 1)]; ' –
jtolds
oops, quiero decir' qi :: int_' – jtolds
más depuración notas. en mi código completo, en realidad tengo 'qi :: rule integer;', que parece que se rompe si reemplazo 'Integer' con' Integer() ', y todos los ejemplos tienen el final '()', que descuidé. Entonces quizás los argumentos de la plantilla a la 'regla 'se estaban arruinando. Excavación. –
jtolds