повысить дух разбора с источником
Я хотел бы иметь возможность анализировать число, сохранять его исходный источник и отслеживать его положение в источнике, сохраняя его в самой структуре.
Это то, что я до сих пор:
#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";