所以,我编写了我的语法,并希望提供一些调试信息,如行号,以便能够使用我自己的调试器逐步生成生成的可执行代码。
经过一些谷歌搜索后,我发现可以完全定义规则中使用的标记类,如下所示:
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方法,该方法在成功匹配规则时调用。 所以我为匹配一行代码的规则实现了标记类。 但由于我找不到从精神中获取当前行号的方法,因此我采用了跟踪当前行的静态变量。 问题是知道何时重置行计数器,正如你在我非常愚蠢的尝试中看到的那样。
这似乎是一种非常复杂的方式来跟踪行号,因此必须有更好的方法。
现在的问题是,获取当前行号的最佳或正确方法是什么?
感谢阅读!