Как преобразовать boost::wave::cpplexer::lex_token в число внутри семантического правила Boost Spirit?
У меня есть потомок Spirit от qi::primitive_parser, который возвращает lex_token<>:
struct TokenParser
: boost::spirit::qi::primitive_parser<TokenParser>
{
TokenParser(boost::wave::token_id _id)
: id(_id)
{}
template <typename Context, typename Iterator>
struct attribute
{
typedef boost::wave::cpplexer::lex_token<> type;
};
template <typename Iterator, typename Context, typename Skipper, typename Attribute>
bool parse(Iterator& first, Iterator const& last, Context&, Skipper const& skipper,
Attribute& attr) const
{
// ...
}
// ...
};
Я хотел бы иметь правило, которое возвращает целое число, если оно анализирует некоторое арифметическое выражение. Давайте рассмотрим самый простой случай: выражение - это просто число. Как я могу преобразовать lex_token<> в число? Т.е. мне нужно построить ленивое выражение, которое бы делало что-то вроде _val = boost::lexical_cast<int>(_1.get_value())
template <typename Iterator>
struct ArithmeticExpr :
public qi::grammar<
Iterator
, WhiteSpace<Iterator>
, int()
>
{
ArithmeticExpr() : ArithmeticExpr::base_type(start)
{
using namespace boost::wave;
using namespace WaveParsers;
// pseudo code inside the square brackets
num = Token(T_INTLIT)[_val = boost::lexical_cast<int>(_1.get_value())];
}
start_type start;
qi::rule<Iterator, WhiteSpace<Iterator>, int()> num;
};
Как мне это сделать?