从C++代码中提取算术运算信息

Extract arithmetic operation information from C++ code

我面临着从 C++ 源代码中提取算术运算信息的问题。例如,我想解析一段C++代码,找出所有进行算术运算的代码的行号,以及运算中涉及的变量或字面量的名称以及对应的运算类型。我对 int 和 double 等内置类型以及用户定义的 类 等算术运算符(如 operator+、operator* 重载)感兴趣。

知道如何实现吗?

编辑:我希望某些编译器可能会生成一些我可以用来实现此目标的中间结果。我做了一些搜索,似乎 libclang 可以生成一些有用的中间结果,但我只是想在花太多时间深入研究之前得到一些建议。

您或许可以使用 clang-query 来完成。让查询恰到好处有点棘手,但是 llvm ast matcher docs 为每个匹配器提供示例非常有用。它还为匹配结果打印 line/col 个数字。

示例代码:

struct complex { float r, i; };

int operator*(int a, complex b)
{
    return 0;
}

int main()
{
    int a = 0;
    complex b;
    return (a * a) + (a * b);
}

returns 个已重载的数学表达式的示例查询:

match cxxOperatorCallExpr(anyOf(hasOverloadedOperatorName("-"), hasOverloadedOperatorName("+"), hasOverloadedOperatorName("*"), hasOverloadedOperatorName("/")))

输出:

   return (a * a) + (a * b);

                     ^~~~~