【发布时间】:2018-02-12 15:54:13
【问题描述】:
我正在尝试使用 clang 及其 python 绑定来处理 C/C++ 代码的 AST。
我有以下测试 C++ 代码:
#include <stdio.h>
class myclass {
public:
void mymethod() {
printf("method\n");
}
};
void testfunc() {
myclass var;
var.mymethod();
}
我编写了以下 python 代码(简化和缩短)来遍历它:
#! /usr/bin/python
import clang.cindex
import sys
def walk(node):
if node.kind == clang.cindex.CursorKind.CALL_EXPR:
print 'name: %s, type: %s' % (node.spelling or node.displayname, node.type.spelling)
for c in node.get_children():
walk(c)
index = clang.cindex.Index.create()
walk(index.parse(sys.argv[1]).cursor)
现在,当我的代码在 testfunc 中到达 var.mymethod() 时,它会显示“mymethod”和“void”。不是我所期望的。我正在尝试检索调用 mymethod 的类类型,而不是方法的返回类型。
【问题讨论】:
-
您正在请求 call-expr 的“类型”(因此是对
mymethod的调用的返回类型)。毫不奇怪,它是void mymethod()- 我敢打赌,如果你将其更改为int,它确实会显示为int。 -
确实,你是对的!这就解释了。您还可以告诉我如何获取我正在调用该方法的类类型吗?这就是我想要实现的目标。
-
或许能给你一个提示,但我不是走 AST 的专家。我的“专长”是为 LLVM 生成代码。我得先深入研究一下。