Python接口clang解析C语言AST抽象语法树
# 1 python上使用clang,进行程序解析成AST,抽象语法树
·
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
;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献3条内容
所有评论(0)