Я хочу использовать python для связывания libclang для генерации AST кода на C. ОК, исходный код изображен ниже.Анализ P в python с libclang, но сгенерированный неверный AST
#include <stdlib.h>
#include "adlist.h"
#include "zmalloc.h"
list *listCreate(void)
{
struct list *list;
if ((list = zmalloc(sizeof(*list))) == NULL)
return NULL;
list->head = list->tail = NULL;
list->len = 0;
list->dup = NULL;
list->free = NULL;
list->match = NULL;
return list;
}
И реализация я писал:
#!/usr/bin/python
# vim: set fileencoding=utf-8
import clang.cindex
import asciitree
import sys
def node_children(node):
return (c for c in node.get_children() if c.location.file.name == sys.argv[1])
def print_node(node):
text = node.spelling or node.displayname
kind = str(node.kind)[str(node.kind).index('.')+1:]
return '{} {}'.format(kind, text)
if len(sys.argv) != 2:
print("Usage: dump_ast.py [header file name]")
sys.exit()
clang.cindex.Config.set_library_file('/usr/lib/llvm-3.6/lib/libclang-3.6.so')
index = clang.cindex.Index.create()
translation_unit = index.parse(sys.argv[1], ['-x', 'c++', '-std=c++11', '-D__CODE_GENERATOR__'])
print(asciitree.draw_tree(translation_unit.cursor, node_children, print_node))
Но конечный результат этого теста, как ниже:
TRANSLATION_UNIT adlist.c
+--FUNCTION_DECL listCreate
+--COMPOUND_STMT
+--DECL_STMT
+--STRUCT_DECL list
+--VAR_DECL list
+--TYPE_REF struct list
Очевидно, что конечный результат не так. есть много кодов, которые не обрабатывались. Я попытался пересечь блок перевода, но результат точно так же, как показано на дереве --- многие узлы исчезли. Почему это так? И есть ли какой-нибудь метод решения проблемы? Спасибо!
Я предполагаю, что причина в том, что Libclang не может проанализировать malloc(). потому что ни один stdlib не был включен в этот код и не имеет определяемого пользователем определения для malloc.