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?