Cómo hacer que el valor del token Boost.Spirit.Lex sea una subcadena de secuencia coincidente (preferiblemente por grupo de coincidencia de expresiones regulares)

Estoy escribiendo un analizador de expresiones simples. Se basa en una gramática Boost.Spirit.Qi basada en los tokens Boost.Spirit.Lex (Boost en la versión 1.56).

Los tokens se definen de la siguiente manera:

using namespace boost::spirit;

template<
    typename lexer_t
>
struct tokens
    : lex::lexer<lexer_t>
{
    tokens()
        : /* ... */,
          variable("%(\\w+)")
    {
        this->self =
            /* ... */ |
            variable;
    }

    /* ... */
    lex::token_def<std::string> variable;
};

Ahora me gustaría elvariable valor de token para ser solo el nombre (el grupo coincidente(\\w+)) sin prefijo% símbolo. ¿Cómo puedo hacer eso?

Usar un grupo coincidente por sí solo no ayuda. Todavía el valor es una cadena completa, incluido el prefijo%.

¿Hay alguna forma de forzar el uso de un grupo coincidente?

¿O al menos de alguna manera se refieren a él dentro de la acción del token?

Intenté también usar acciones como esta:

variable[lex::_val = std::string(lex::_start + 1, lex::_end)]

pero no pudo compilar. Error afirmó que ninguno de losstd::string las sobrecargas del constructor podrían coincidir con los argumentos:

(const boost::phoenix::actor<Expr>, const boost::spirit::lex::_end_type)

Aún más simple

variable[lex::_val = std::string(lex::_start, lex::_end)]

No se pudo compilar. Con una razón similar, solo el primer tipo de argumento era ahoraboost::spirit::lex::_start_type.

Finalmente probé esto (aunque parece un gran desperdicio):

lex::_val = std::string(lex::_val).erase(0, 1)

pero eso tampoco pudo compilar. Esta vez el compilador no pudo convertirconst boost::spirit::lex::_val_type astd::string.

¿Hay alguna forma de lidiar con este problema?

Respuestas a la pregunta(1)

Su respuesta a la pregunta