So wird der Boost.Spirit.Lex-Token-Wert zu einer Teilzeichenfolge einer übereinstimmenden Sequenz (vorzugsweise nach Regex-Übereinstimmungsgruppe) gemacht

Ich schreibe einen einfachen Parser für Ausdrücke. Es basiert auf einer Boost.Spirit.Qi-Grammatik, die auf Boost.Spirit.Lex-Token basiert (Boost in Version 1.56).

Die Token sind wie folgt definiert:

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;
};

Nun möchte ich dasvariable Token-Wert, der nur der Name sein soll (die übereinstimmende Gruppe(\\w+)) ohne Präfix% Symbol. Wie mache ich das

Es hilft nicht, eine passende Gruppe alleine zu verwenden. Der Standbildwert ist eine vollständige Zeichenfolge, einschließlich des Präfixes%.

ibt es eine Möglichkeit, die Verwendung einer übereinstimmenden Gruppe zu erzwinge

Oder zumindest irgendwie in Aktion des Tokens darauf verweisen?

Ich habe versucht, auch mit Aktion wie folgt:

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

aber es konnte nicht kompiliert werden. Fehler behauptet, dass keiner derstd::string Konstruktorüberladungen könnten mit Argumenten übereinstimmen:

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

och einfach

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

konnte nicht kompiliert werden. Aus ähnlichen Gründen war jetzt nur der erste Argumenttypboost::spirit::lex::_start_type.

Endlich habe ich es versucht (obwohl es wie eine große Verschwendung aussieht):

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

aber das konnte auch nicht kompiliert werden. Diesmal konnte der Compiler nicht von @ konvertierconst boost::spirit::lex::_val_type zustd::string.

ibt es eine Möglichkeit, mit diesem Problem umzugehe

Antworten auf die Frage(2)

Ihre Antwort auf die Frage