gpt4 book ai didi

python - 在 libclang 中如何从 stdio.h 中排除函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:40 26 4
gpt4 key购买 nike

使用libclang时,如何从stdio.h中排除函数?

当我使用下面的源代码仅收集函数定义时,我最终也会从 stdio.h 中获取所有函数。

我读到我们可以在创建索引时传递“-x c-header”类型的参数。但是这种给出参数的方式适用于 libclang.

tu = index.parse(self.filename, "-x c-header")

包含“c-header”参数后,它还希望我根据“cindex.py”中“parse”函数的定义填写“unsaved_files”数组。

def parse(self, path, args = [], unsaved_files = [], options = 0):

我不知道什么是正确的方法。

def funcdefn_visitor(self, node, parent, userdata):
if node.kind == clang.cindex.CursorKind.FUNCTION_DECL: #gives function definitions
self.func_defn.append(clang.cindex.Cursor_displayname(node))
self.func_defn_line_no.append(node.location.line)
self.func_defn_col_no.append(node.location.column)
print 'Found %s [line=%s, col=%s]' % (
clang.cindex.Cursor_displayname(node),
node.location.line,
node.location.column)
return 2 # means continue visiting recursively

index = clang.cindex.Index.create()

tu = index.parse(self.filename)
#-- link cursor visitor to call back to give function definitions
clang.cindex.Cursor_visit(
tu.cursor,
clang.cindex.Cursor_visit_callback(self.funcdefn_visitor),
None)

最佳答案

-x c-header 命令行开关用于生成 precompiled headers ,不从翻译单元中排除标题。

我认为从特定文件中排除函数的正确方法是在访问 AST 时跳过其中的所有节点。为了详细说明您的示例,我们的想法是在访问者中进行第一次测试,以尽早跳过文件并避免访问其所有子节点。

def funcdefn_visitor(self, node, parent, userdata):

# You might want to change the test here
if node.location.file.endswith("/stdio.h"):
print "Skipping 'stdio.h'"
# Continue with next sibling
return 1

if node.kind == clang.cindex.CursorKind.FUNCTION_DECL: #gives function definitions
self.func_defn.append(clang.cindex.Cursor_displayname(node))
self.func_defn_line_no.append(node.location.line)
self.func_defn_col_no.append(node.location.column)

print 'Found %s [line=%s, col=%s]' % (
clang.cindex.Cursor_displayname(node),
node.location.line,
node.location.column)

# Continue visiting recursively
return 2

index = clang.cindex.Index.create()

tu = index.parse(self.filename)
#-- link cursor visitor to call back to give function definitions
clang.cindex.Cursor_visit(
tu.cursor,
clang.cindex.Cursor_visit_callback(self.funcdefn_visitor),
None)
<小时/>

现在我不是 cindex.py 的专家(libclang's python API),但我认为您的示例遵循 C API 概念而不是 python 概念。引用文档(强调我的):

This module provides an interface to the Clang indexing library. It is a low-level interface to the indexing library which attempts to match the Clang API directly while also being "pythonic". Notable differences from the C API are:

  • string results are returned as Python strings, not CXString objects.

  • null cursors are translated to None.

  • access to child cursors is done via iteration, not visitation.

虽然cindex.pyCursor_visit绑定(bind)到clang_visitChildren ,它甚至不导出 CXChildVisitResult枚举,这意味着您需要对 BreakContinueRecurse 的值进行硬编码。 Python 的处理方式包括迭代子节点,由 Cursor.get_children() 方法返回。这些 SO 答案( 12 )中给出了一个示例,您可以调整该示例以根据源文件过滤掉节点。

关于python - 在 libclang 中如何从 stdio.h 中排除函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465499/

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