如何使用boost spirit x3的位置信息来注释AST?

时间:2016-03-22 21:21:26

标签: c++ boost c++14 boost-spirit boost-spirit-x3

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

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

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方法,该方法在成功匹配规则时调用。 所以我为匹配一行代码的规则实现了标记类。 但由于我找不到从精神中获取当前行号的方法,因此我采用了跟踪当前行的静态变量。 问题是知道何时重置行计数器,正如你在我非常愚蠢的尝试中看到的那样。

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

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

感谢阅读!

0 个答案:

没有答案