2016-07-17 49 views
2

我正在尝试使用libclang python绑定来解析我的C++源文件。我无法获得宏观的价值或扩大宏观。
这是我的示例C++代码展开宏并检索宏值

#define FOO 6001 
#define EXPAND_MACR \ 
     int \ 
     foo = 61 
int main() 
{ 
    EXPAND_MACR; 
    cout << foo; 
    return 0; 
} 


这是我的Python脚本

import sys 
import clang.cindex 

def visit(node): 
    if node.kind in (clang.cindex.CursorKind.MACRO_INSTANTIATION, clang.cindex.CursorKind.MACRO_DEFINITION):   
    print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (node.displayname, node.kind, node.data, node.extent, node.location.line, node.location.column) 
for c in node.get_children(): 
    visit(c) 

if __name__ == '__main__': 
    index = clang.cindex.Index.create() 
    tu = index.parse(sys.argv[1], options=clang.cindex.TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD) 
    print 'Translation unit:', tu.spelling 
    visit(tu.cursor) 


这是信息,我回来从铛:如果你观察

Found FOO Type CursorKind.MACRO_DEFINITION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 4, column 9>, end <SourceLocation file 'sample.cpp', line 4, column 17>> [line=4, col=9] 
Found EXPAND_MACR Type CursorKind.MACRO_DEFINITION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 6, column 9>, end <SourceLocation file 'sample.cpp', line 8, column 11>> [line=6, col=9] 
Found EXPAND_MACR Type CursorKind.MACRO_INSTANTIATION DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> Extent <SourceRange start <SourceLocation file 'sample.cpp', line 12, column 2>, end <SourceLocation file 'sample.cpp', line 12, column 13>> [line=12, col=2] 


我python脚本,node.data给出

DATA <clang.cindex.c_void_p_Array_3 object at 0x10b86d950> 


我可以读程度上铛&然后从开始分析该文件结束位置来获取返回值数据。我想知道,是否存在获取宏观价值的更好方法?
我想直接获取宏的值()(不使用Extent)。我怎么弄到的?
此外,对于EXPAND_MACR是想int foo = 61

我已经看到这些后:Link-1 & Link-2
任何帮助将不胜感激

回答

4

不,使用范围逐行扩展似乎是提取(扩展宏)的唯一方法。

我怀疑问题在于,当libclang看到你的代码时,宏已经被预处理器删除 - 你在AST中看到的节点更像是注释而不是真正的节点。

#define FOO 6001 
#define EXPAND_MACR \ 
     int \ 
     foo = 61 
int main() 
{ 
    EXPAND_MACR; 
    return 0; 
} 

是真正的AST

TRANSLATION_UNIT sample.cpp 
    +-- ... *some nodes removed for brevity* 
    +--MACRO_DEFINITION FOO 
    +--MACRO_DEFINITION EXPAND_MACR 
    +--MACRO_INSTANTIATION EXPAND_MACR 
    +--FUNCTION_DECL main 
    +--COMPOUND_STMT 
     +--DECL_STMT 
     | +--VAR_DECL foo 
     |  +--INTEGER_LITERAL 
     +--RETURN_STMT 
      +--INTEGER_LITERAL 

这相当于只运行预处理器(并告诉它给你所有的预处理指令中的列表)。你可以看到类似通过运行:

clang -E -Wp,-dD src.cc 

其中给出:

# 1 "<command line>" 1 
# 1 "<built-in>" 2 
# 1 "src.cc" 2 
#define FOO 6001 
#define EXPAND_MACR int foo = 61 


int main() 
{ 
    int foo = 61; 
    return 0; 
}