变更记录
方案名称
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
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)
|
使用:
1
| $ python oc_token.py path-to-your-oc-file.m
|
示例:
main.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #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
命令后输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| 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 : }
|
效果图
(无)
备注
(无)