1

I have a Spirit's qi::primitive_parser descendant that returns a 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
    {
        // ...
    }

    // ...
};

I would like to have a rule that returns an integer if it parses some arithmetic expression. Let's take the most simple case: the expression is just a number. How can I convert lex_token<> to a number? I.e. I have to build a lazy expression that would do something like _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;
};

How can I do it?

facetus
  • 1,091
  • 6
  • 20

0 Answers0