Как преобразовать 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;
};

Как мне это сделать?

0 ответов

Другие вопросы по тегам