Как аннотировать AST информацией о положении с помощью Boost Spirit x3?

Итак, я написал свою грамматику и хотел бы предоставить некоторую отладочную информацию, такую ​​как номера строк, чтобы иметь возможность просматривать сгенерированный исполняемый код с помощью моего собственного отладчика.

После некоторого поиска в Google я обнаружил, что можно полностью определить классы тегов, используемые в правилах, следующим образом:

x3::rule<class CodeLine, ast::InstructionOrDirectiveAndArgs> const code_line = "code_line";

auto const code_line_def = ...

class CodeLine {
public:
template <typename T, typename Iterator, typename Context>
inline void on_success(Iterator const& first, Iterator const& last, T& ast, Context const& context) {

static std::uint64_t line = 0;
auto& error_handler = x3::get<error_handler_tag>(context).get();
error_handler.tag(ast, first, last);
ast.line_no = line;
if (*last == '\0') {
line = 0;
} else {
line += 1;
}
}
};

В этих полностью определенных классах тегов можно реализовать метод on_success, который вызывается, когда правило может быть успешно найдено.
Поэтому я реализовал класс тегов для правила, соответствующего строке кода.
Но так как я не смог найти способ получить номер текущей строки из Spirit, я прибег к статической переменной, которая отслеживает текущую строку.
Проблема в том, чтобы узнать, когда нужно сбросить счетчик строки, как вы можете видеть на моей довольно глупой попытке.

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

Вопрос теперь в том, каков наилучший или правильный способ получить текущий номер строки?

Спасибо за прочтение!

6

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector