变更记录

序号 录入时间 录入人 备注
1 2017-07-15 Alfred Jiang -

方案名称

LLVM - 使用 libclang 的 python binding 来进行词法分析(Lexical Analysis)

关键字

LLVM \ libclang \ python binding \ 语法分析

需求场景

  1. 希望通过 libClang python binding 进行语法分析时

参考链接

  1. 红黑联盟 - libClang python binding介绍(推荐)
  2. GitHub - ming1016/study/深入剖析 iOS 编译 Clang / LLVM
  3. 爱丸工作室 - 在Python中使用Clang来解析C++【翻译】
  4. 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 : }

效果图

(无)

备注

(无)

results matching ""

    No results matching ""