变更记录
序号 | 录入时间 | 录入人 | 备注 |
---|---|---|---|
1 | 2017-07-15 | Alfred Jiang | - |
方案名称
LLVM - 使用 libclang 的 python binding 来进行词法分析(Lexical Analysis)
关键字
LLVM \ libclang \ python binding \ 语法分析
需求场景
- 希望通过 libClang python binding 进行语法分析时
参考链接
- 红黑联盟 - libClang python binding介绍(推荐)
- GitHub - ming1016/study/深入剖析 iOS 编译 Clang / LLVM
- 爱丸工作室 - 在Python中使用Clang来解析C++【翻译】
- Eli Bendersky's website - Parsing C++ in Python with Clang
详细内容
该脚本目前只使用了 clang 中 cindex.py 中的 get_tokens() 完成词法分析,更多功能参考以下源码
http://llvm.org/svn/llvm-project/cfe/trunk/bindings/python/clang/cindex.py
1. 安装 LLVM 和 Clang
参考 LLVM - Mac 下使用 cmake 安装 LLVM 和 Clang 安装编译 LLVM 和 Clang
2. 编写 python 词法分析脚本
- 脚本所依赖的
import clang.cindex
位于 LLVM 源代码中/llvm/tools/clang/bindings/python
文件夹中,编写脚本时将该目录下 clang 文件夹拷贝至脚本同级目录下 set_library_path()
方法所设置路径为 LLVM build 文件夹下lib
文件夹路径
oc_token.py
#!/usr/bin/env python
import clang.cindex
import sys
from clang.cindex import Config
Config.set_library_path('/Users/viktyz/Documents/llvm/build/lib')
def showToken(node):
ts=node.get_tokens()
for t in ts:
print t.kind.name + ' : ' + t.spelling
index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1], ['-x', 'objective-c'])
showToken(tu.cursor)
使用:
$ python oc_token.py path-to-your-oc-file.m
示例:
main.m
#import <Foundation/Foundation.h>
#define DEFINEEight 8
int main(){
@autoreleasepool {
int eight = DEFINEEight;
int six = 6;
NSString* site = [[NSString alloc] initWithUTF8String:"starming"];
int rank = eight + six;
NSLog(@"%@ rank %d", site, rank);
}
return 0;
}
执行 python oc_token.py main.m
命令后输出如下:
PUNCTUATION : #
IDENTIFIER : import
PUNCTUATION : <
IDENTIFIER : Foundation
PUNCTUATION : /
IDENTIFIER : Foundation
PUNCTUATION : .
IDENTIFIER : h
PUNCTUATION : >
PUNCTUATION : #
IDENTIFIER : define
IDENTIFIER : DEFINEEight
LITERAL : 8
KEYWORD : int
IDENTIFIER : main
PUNCTUATION : (
PUNCTUATION : )
PUNCTUATION : {
PUNCTUATION : @
KEYWORD : autoreleasepool
PUNCTUATION : {
KEYWORD : int
IDENTIFIER : eight
PUNCTUATION : =
IDENTIFIER : DEFINEEight
PUNCTUATION : ;
KEYWORD : int
IDENTIFIER : six
PUNCTUATION : =
LITERAL : 6
PUNCTUATION : ;
IDENTIFIER : NSString
PUNCTUATION : *
IDENTIFIER : site
PUNCTUATION : =
PUNCTUATION : [
PUNCTUATION : [
IDENTIFIER : NSString
IDENTIFIER : alloc
PUNCTUATION : ]
IDENTIFIER : initWithUTF8String
PUNCTUATION : :
LITERAL : "starming"
PUNCTUATION : ]
PUNCTUATION : ;
KEYWORD : int
IDENTIFIER : rank
PUNCTUATION : =
IDENTIFIER : eight
PUNCTUATION : +
IDENTIFIER : six
PUNCTUATION : ;
IDENTIFIER : NSLog
PUNCTUATION : (
PUNCTUATION : @
LITERAL : "%@ rank %d"
PUNCTUATION : ,
IDENTIFIER : site
PUNCTUATION : ,
IDENTIFIER : rank
PUNCTUATION : )
PUNCTUATION : ;
PUNCTUATION : }
KEYWORD : return
LITERAL : 0
PUNCTUATION : ;
PUNCTUATION : }
效果图
(无)
备注
(无)