обработка ошибок и аннотации в Boost.Spirit X3

Какая логика при использовании boost::spirit::x3::position_tagged в качестве базового класса для некоторых узлов AST (как выбрать, какие из них должны быть помечены, например, для языка, подобного C?) и других конструкций, используемых в определении идентификатора правила, например:

struct error_handler_tag;

struct error_handler_base
{

template< typename Iterator, typename Exception, typename Context >
x3::error_handler_result
on_error(Iterator & /*first*/, Iterator const & /*last*/,
Exception const & x, Context const & context)
{
std::string message_ = "Error! Expecting: " + x.which() + " here:";
auto & error_handler = x3::get< error_handler_tag >(context).get();
error_handler(x.where(), message_);
return x3::error_handler_result::fail;
}

};

struct annotation_base
{

template< typename T, typename Iterator, typename Context >
void
on_success(Iterator const & first, Iterator const & last,
T & ast, Context const & context)
{
auto & error_handler = x3::get< error_handler_tag >(context).get();
error_handler.tag(ast, first, last);
}

};
// ...
error_handler_type error_handler(beg, end, std::cerr);
auto const parser_ = x3::with< error_handler_tag >(std::ref(error_handler))[grammar];
// ...

?

В случае ошибочного ввода (грамматика не совпадает) эта часть кода ничего не делает (даже в случае самой простой грамматики, которая должна распознавать идентификаторы) — не печатать сообщение об ошибке.

5

Решение

Грамотно правильный анализ не означает, что AST также может быть успешно оценен. Подумайте о грамматике, определяющей некоторый оценщик, который может оценивать математические выражения, такие как «3 + 4 / (5-5)». Он будет хорошо разбираться, но во время оценки AST вы можете поднять ошибку на 5-5 в качестве аргумента для деления. Для этого удобно иметь положение элемента, на который вы жалуетесь.

0

Другие решения