【问题标题】:AST of a project by ClangClang 项目的 AST
【发布时间】:2018-03-05 01:24:33
【问题描述】:

我使用 Clang python 绑定来提取 c/c++ 文件的 AST。它非常适合我编写的一个简单程序。问题是当我想将它用于像 openssl 这样的大项目时。我可以为项目的任何单个文件运行 clang,但 clang 似乎错过了项目的一些标题,并且只给了我文件的几个函数的 AST,而不是所有函数。我通过 -I 设置了包含文件夹,但仍然获得了部分功能。

这是我的代码:

import clang.cindex as cl    
cl.Config.set_library_path(clang_lib_dir)
index = cl.Index.create()
lib = 'Path to include folder'
args = ['-I{}'.format(lib)]
translation_unit = index.parse(source_file, args=args)
my_get_info(translation_unit.cursor)

我收到太多头文件未找到错误。

更新

我用Make通过clang编译openssl?我可以将 -emit-ast 选项传递给 clang 以转储每个文件的 ast,但我现在无法通过 clang python 绑定读取它。

有什么线索可以保存翻译单元的序列化表示,以便我能够通过 index.read() 读取它吗?

谢谢!

【问题讨论】:

  • 你用什么命令来获取简单程序的 AST ?
  • 我更新了我的帖子并添加了我的代码。

标签: clang llvm abstract-syntax-tree


【解决方案1】:

您“只需”提供正确的args。但请注意两个可能的问题。

不同的文件可能需要不同的参数进行解析。最简单的解决方案是获取compilation database,然后从中提取编译命令。如果您采用这种方式,请注意您需要稍微过滤掉参数并删除-c FooBar.cpp(可能还有其他一些)之类的东西,否则您可能会得到类似 ASTReadError 的东西。

另一个问题是包含路径 (-I ...) 可能与源目录相关。即,如果一个文件main.cpp 从目录/opt/project/ 编译并带有-I include/path 参数,那么在调用index.parse(source_file, args=args) 之前,您需要将(chdir)插入/opt/project,完成后您将可能需要回到原来的工作目录。所以代码可能看起来像这样(伪代码):

cwd = getcwd()
chdir('/opt/project')
translation_unit = index.parse(source_file, args=args)
chdir(cwd)

希望对你有帮助。

【讨论】:

  • 谢谢,亚历克斯!我进行了或多或少相同的结构。我用Make编译了这个项目。然后它为每个单独的 c 文件提供了一个 .d 文件,其中包含包含路径。然后我使用 clang python binding 并将这些带有 -I 选项的路径传递给 args。我现在可以分别获取所有文件的 AST。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2011-07-05
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多