2012-10-01 13 views
8

Estoy tratando de construir un AST con espíritu de impulso y he estado luchando con la forma de construir argumentos sintetizados cuando se utilizan expresiones lambda C++ 11 como acciones semánticas.¿Cómo construir un argumento sintetizado a partir de una acción semántica de C++ 11 lambda en boost spirit?

Decir que tengo una regla:

qi::rule<char*,ascii::space_type,SomeStruct()> rule = some_parser[[](some_type val){/*code to build SomeStruct from val*/}];

¿Cómo sabe mi lambda volver el argumento sintetizado (SomeStruct)? Por el valor de retorno? Porque qi :: _ val no está disponible en este contexto, ¿verdad? (Esto es un poco oscuro para mí, lo siento si esta pregunta no está bien formulada)

¡Gracias de antemano por cualquier apuntador en la dirección correcta!

Respuesta

7

Esto parece hacer el truco: http://ereethahksors.blogspot.fr/2012/05/using-c11-lambdas-with-boostspiritqi.html

cita relevante:

typedef rule<Iterator, Label*(), space_type> label_rule_type; 
label = lit(':') > symbol[[&](string& name, typename label_rule_type::context_type& context) 
      { 
      boost::fusion::at_c<0>(context.attributes) = _ast->addLabel(name); 
      }]; 

La parte más importante aquí es el typedef y su context_type. Si solo quieres usar C++ 11 lambdas para hacer cosas muy simples con tu atributo pasado, las cosas son muy fáciles, pero si quieres acceder a los locales o al qi::_val, tendrás que usar el parámetro de contexto. contexto es una instancia muy modelada de boost::spirit::context que le da acceso a dos secuencias boost::fusion; atributos y lugareños.

Cuestiones relacionadas