1 python上使用clang,进行程序解析成AST,抽象语法树

1 win10上安装LLVM 作用:能够安装各种lib

2 pip install clang 作用:作为调用clangAPI的接口,注意这个clang只是一个接口

3 目录AST树中调用的函数都在 D:\ProgramFiles\python3.6.8\Lib\site-packages\clang\cindex.py

1 from clang.cindex import Index
类Index索引类型,clang.cindex库的主接口,通过提供一个接口来读写来解析翻译
index = Index.create() 创建一个索引
index.parse(filepath, 解析文件的路径
args=None, 额外参数通过命令行参数添加
Unsaveed_file=None, 列表,一项是映射文件名字 一项是替换内容
options=0) 其他参数

2 引用

import clang.cindex
from clang.cindex import Index  #主要API
from clang.cindex import Config  #配置
from clang.cindex import CursorKind  #索引结点的类别
from clang.cindex import TypeKind    #节点的语义类别

3 clang.cindex需要用到libclang.so共享库,所以先配置共享库

libclangPath = r'D:/Program Files/LLVM/bin/libclang.dll'
#这个路径需要自己先在笔记本上安装	
if Config.loaded == True:
    print("Config.loaded == True:")
    #pass
else:
    Config.set_library_file(libclangPath)
    print("install path")

4 创建AST索引

file_path = r"test.c"
index = Index.create()

tu = index.parse(file_path)
AST_root_node= tu.cursor  #cursor根节点
print(AST_root_node)

5 前序遍历AST

'''
前序遍历严格来说是一个二叉树才有的概念。这里指的是对于每个节点,先遍历本节点,再遍历子节点的过程。
'''
node_list = []
def preorder_travers_AST(cursor):
    for cur in cursor.get_children():
        #do something
        print(cur.spelling)
        preorder_travers_AST(cur)

preorder_travers_AST(AST_root_node)

输出

main

printf
printf
printf


"hello world\n"

6提取每个分词的方法。

cursor_content=""
for token in AST_root_node.get_tokens():
#针对一个节点,调用get_tokens的方法。
    print(token.spelling)

输出:

#
include
<
stdio
.
h
>
#
include
<
stdlib
.
h
>
int
main
(
)
{
printf
(
"hello world\n"
)
;
// df = open("test.c","r");
return
0
;
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐