2015-12-17 1 views
1

Я хочу использовать 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.

ответ

1

Анализ не завершился успешно, вероятно, из-за того, что вам не хватает некоторых включенных путей.

Вы можете подтвердить, в чем проблема, напечатав диагностические сообщения.

translation_unit = index.parse(sys.argv[1], args) 
for diag in translation_unit.diagnostics: 
    print diag 

 Смежные вопросы

  • Нет связанных вопросов^_^