回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<P>我有以下脚本,试图打印出给定C++文件中的所有AST节点。当在包含简单include的简单文件(同一目录中的头文件等)上使用它时,它可以很好地工作。在</p>
<pre><code>#!/usr/bin/env python
from argparse import ArgumentParser, FileType
from clang import cindex
def node_info(node):
return {'kind': node.kind,
'usr': node.get_usr(),
'spelling': node.spelling,
'location': node.location,
'file': node.location.file.name,
'extent.start': node.extent.start,
'extent.end': node.extent.end,
'is_definition': node.is_definition()
}
def get_nodes_in_file(node, filename, ls=None):
ls = ls if ls is not None else []
for n in node.get_children():
if n.location.file is not None and n.location.file.name == filename:
ls.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(n)
get_nodes_in_file(n, filename, ls)
return ls
def main():
arg_parser = ArgumentParser()
arg_parser.add_argument('source_file', type=FileType('r+'),
help='C++ source file to parse.')
arg_parser.add_argument('compilation_database', type=FileType('r+'),
help='The compile_commands.json to use to parse the source file.')
args = arg_parser.parse_args()
compilation_database_path = args.compilation_database.name
source_file_path = args.source_file.name
clang_args = ['-x', 'c++', '-std=c++11', '-p', compilation_database_path]
index = cindex.Index.create()
translation_unit = index.parse(source_file_path, clang_args)
file_nodes = get_nodes_in_file(translation_unit.cursor, source_file_path)
print [p.spelling for p in file_nodes]
if __name__ == '__main__':
main()
</code></pre>
<P>但是,当我运行脚本并提供一个具有CixILL的有效C++文件时,我得到了一个^ {CD1>}命令.json父目录中的文件。使用CMake和clang,这段代码运行和构建都很好,但是我似乎不知道如何传递指向编译的参数_命令.json正确地。在</p>
<p>我也很难在clang文档中找到这个选项,并且无法使<code>-ast-dump</code>工作。但是,clang check只需传递文件路径就可以了!在</p>