7

所以,我已经编写了我的语法,并想提供一些调试信息,比如行号,以便能够使用我自己的调试器单步执行生成的可执行代码。

经过一番谷歌搜索后,我发现可以完全定义规则中使用的标记类,如下所示:

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 中获取当前行号的方法,所以我求助于一个静态变量来跟踪当前行。问题是要知道何时重置线路计数器,正如您在我相当愚蠢的尝试中看到的那样。

这似乎是一种非常复杂的方法来跟踪行号,因此必须有更好的方法。

现在的问题是,获取当前行号的最佳或正确方法是什么?

谢谢阅读!

4

0 回答 0