gpt4 book ai didi

python - 使用 libclang 进行函数边界识别

转载 作者:行者123 更新时间:2023-11-28 18:23:07 25 4
gpt4 key购买 nike

我正在学习使用 Python + libclang 解析 C++ 文件,并借助 Eli Bendersky 提供的这个信息量很大(但有点过时)的教程.

我的目标是解析 C++ 文件并识别这些文件中存在的函数的函数边界。我希望构建一个这种形式的 python 字典:

{<func_name>:(<func_start_loc>, <func_end_loc>), ...}

为此,我能够获取函数名称(使用 cursor.spelling 用于 CursorKind.FUNCTION_DECLCursorKind.CXX_METHOD 类型的 AST 节点)和起始位置(使用 cursor.location )

我的问题是,如何获取函数位置的结尾

最佳答案

您正在寻找 Cursor 类的 extent 属性。例如:

s = '''
void f();
void g()
{}
void f()
{}
'''

idx = clang.cindex.Index.create()
tu = idx.parse('tmp.cpp', unsaved_files=[('tmp.cpp', s)])
for f in tu.cursor.walk_preorder():
if f.kind == CursorKind.FUNCTION_DECL:
print f.extent

将返回与源范围等效的 Python:

<SourceRange start <SourceLocation file 'tmp.cpp', line 2, column 1>, end <SourceLocation file 'tmp.cpp', line 2, column 9>>
<SourceRange start <SourceLocation file 'tmp.cpp', line 3, column 1>, end <SourceLocation file 'tmp.cpp', line 4, column 3>>
<SourceRange start <SourceLocation file 'tmp.cpp', line 5, column 1>, end <SourceLocation file 'tmp.cpp', line 6, column 3>>

如果您想要函数体而不仅仅是它们的声明,您可能需要考虑使用 Cursor.is_definition 将注意力限制在定义上。

关于python - 使用 libclang 进行函数边界识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com