本文部分翻译自http://clang.llvm.org/docs/Tooling.html,加上个人学习经验.
首先,需要要选择好正确的接口(Choosing the Right Interface for Your Application)
基于clang的应用主要三种接口:
LibClang:
文档:http://clang.llvm.org/doxygen/group__CINDEX.html
详细解说可以见以下视频:
视频: http://devimages.apple.com/llvm/videos/Libclang.mov
Pdf: http://llvm.org/devmtg/2010-11/Gregor-libclang.pdf但要注意这个接口无法完全得到ClangAST的信息,下面两个都可以,但有其他限制.(可以尝试一下将所有的CXCursor中的token输出,和clang plugin中的-ast-dump产生的效果比较一下就知道了)
Clang Plugins
这套接口用于clang在编译时,给AST(抽象语法树)增加一些额外的动作,能够提供lint风格(一款出错检测软件)的warnings 或者 errors,Clang Plugins介绍文档:http://clang.llvm.org/docs/ClangPlugins.html
可以参考该视频的后半部分(使用了-ast-dump等工具,需要翻wall): http://www.youtube.com/watch?v=VqCkCDFLSscLibTooling
这是ASTMatcher的文档:http://clang.llvm.org/docs/LibASTMatchersReference.html
ASTMatcher.h:http://clang.llvm.org/doxygen/ASTMatchers_8h_source.html
LibTooling的介绍文档:http://clang.llvm.org/docs/LibTooling.html
PS:
其实翻Wall的视频中介绍了AST结点是什么样子的,我这里再贴一下:
文件内容:
int main(){
int a;
return 0;
}
-ast-dump的结果:
TranslationUnitDecl 0xc809540 <<invalid sloc>>
|-TypedefDecl 0xc809810 <<invalid sloc>> __builtin_va_list 'char *'
`-FunctionDecl 0xc809880 <newfile.c:1:1, line:4:1> main 'int ()'
`-CompoundStmt 0xc809958 <line:1:11, line:4:1>
|-DeclStmt 0xc809920 <line:2:2, col:7>
| `-VarDecl 0xc8098f0 <col:2, col:6> a 'int'
`-ReturnStmt 0xc809948 <line:3:2, col:9>
`-IntegerLiteral 0xc809930 <col:9> 'int' 0