повысить дух разбора с источником

Я хотел бы иметь возможность анализировать число, сохранять его исходный источник и отслеживать его положение в источнике, сохраняя его в самой структуре.

Это то, что я до сих пор:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 

#include 
#include 

struct Position
{
    Position()
        : line(-1)
    {
    }

    size_t line;
};

struct Number : public Position
{
    Number()
        : Position()
        , value(-1)
        , source()
    {
    }

    unsigned    value;
    std::string source;
};

using namespace boost::spirit;

BOOST_FUSION_ADAPT_STRUCT(Number,
                            (unsigned,    value)
                            (std::string, source)
                            (size_t,      line)
                          );

template 
struct source_hex : qi::grammar
{
    source_hex() : source_hex::base_type(start)
    {
        using qi::eps;
        using qi::hex;
        using qi::lit;
        using qi::raw;
        using qi::_val;
        using qi::_1;
        using ascii::char_;

        namespace phx = boost::phoenix;
        using phx::at_c;
        using phx::begin;
        using phx::end;
        using phx::construct;

        start = raw[   (lit("0x") | lit("0X"))
                     >> hex [at_c(_val) = _1]
                   ][at_c(_val) = get_line(begin(_1))]
                    [at_c(_val) = construct(begin(_1), end(_1))]

        ;
    }

    qi::rule start;
};

и тестовый код:

typedef line_pos_iterator Iterator;
source_hex g;
Iterator iter(str.begin());
Iterator end(str.end());

Number number;
bool r = parse(iter, end, g, number);
if (r && iter == end) {
    std::cout < number.line < ": 0x" < std::setw(8) < std::setfill('0') < std::hex < number.value < " // " < number.source < "\n";
} else
    std::cout < "Parsing failed\n";

Ответы на вопрос(1)

Ваш ответ на вопрос