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