使用Clang作为库 —— Clang AST
Clang AST
- 1. 介绍
- 2. 检查AST
- 3. AST Context
- 4. AST节点
本文为译文,点击 此处查看原文。
本文档温和地介绍了Clang AST的神秘之处,主要针对那些希望为Clang做贡献的开发人员,或者使用基于Clang AST的工具(如AST matchers)的开发人员。
1. 介绍
Clang的AST不同于其他编译器生成的AST,因为它非常类似于编写的C++代码和C++标准。例如,括号表达式和编译时常量在AST中以未简化的形式可用,这使得Clang的 AST非常适合于重构工具。
所有Clang AST节点的文档都可以通过生成的Doxygen获得。doxygen在线文档也由您最喜欢的搜索引擎索引,该引擎将对clang进行搜索,AST节点的类名通常会显示您正在寻找的类的doxygen(例如,搜索:clang ParenExpr
)。
2. 检查AST
熟悉Clang AST的一个好方法是在一些简单的示例代码中实际查看它。Clang具有一个内置的AST-dump
模式,可以使用标记-ast-dump
启用该模式。
让我们看一个简单的示例AST:
$ cat test.cc
int f(int x) {int result = (x / 42);return result;
}# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <<invalid sloc>>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 <test.cc:1:1, line:4:1> f 'int (int)'|-ParmVarDecl 0x5aeaa90 <line:1:7, col:11> x 'int'`-CompoundStmt 0x5aead88 <col:14, line:4:1>|-DeclStmt 0x5aead10 <line:2:3, col:24>| `-VarDecl 0x5aeac10 <col:3, col:23> result 'int'| `-ParenExpr 0x5aeacf0 <col:16, col:23> 'int'| `-BinaryOperator 0x5aeacc8 <col:17, col:21> 'int' '/'| |-ImplicitCastExpr 0x5aeacb0 <col:17> 'int' <LValueToRValue>| | `-DeclRefExpr 0x5aeac68 <col:17> 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'| `-IntegerLiteral 0x5aeac90 <col:21> 'int' 42`-ReturnStmt 0x5aead68 <line:3:3, col:10>`-ImplicitCastExpr 0x5aead50 <col:10> 'int' <LValueToRValue>`-DeclRefExpr 0x5aead28 <col:10> 'int' lvalue Var 0x5aeac10 'result' 'int'
一个翻译单元中的顶层声明始终是 TranslationUnitDecl。在本例中,我们编写的第一个声明是“f”
的 FunctionDecl。“f”
的 body 是一个复合语句(CompoundStmt),复合语句的子节点是一个 DeclStmt(声明我们的结果变量)和一个 ReturnStmt。
3. AST Context
一个翻译单元的 AST 的所有信息都打包在类 ASTContext 中。它允许从 getTranslationUnitDecl
开始遍历整个翻译单元,或者对于已解析的翻译单元,访问 Clang 的标识符表。
4. AST节点
Clang 的 AST 节点是基于没有公共祖先的类层次结构建模的。相反,对于像 Decl 和 Stmt 这样的基本节点类型,有多个更大的层次结构。许多重要的AST节点派生自 Type、Decl、DeclContext 或 Stmt,有些类同时派生自 Decl
和 DeclContext
。
AST 中还有许多节点不是更大层次结构的一部分,只能从特定的其他节点访问,比如 CXXBaseSpecifier。
因此,要遍历整个 AST,首先从 TranslationUnitDecl 开始,然后递归遍历从该节点可以到达的所有内容 —— 必须为每个特定的节点类型编码此信息。这个算法是在 RecursiveASTVisitor 中编码的。请参阅 RecursiveASTVisitor 教程。
Clang AST中最基本的两个节点是语句(Stmt)和声明(Decl)。注意:表达式(Expr)也是 Clang AST 中的语句。
使用Clang作为库 —— Clang AST相关推荐
- 使用Clang作为库 —— Clang Plugins
Clang Plugins 1. 介绍 2. 编写一个PluginASTAction 3. 注册一个plugin 4. 定义pragmas 5. 把它们放在一起 6. 运行此plugin 6.1 使用 ...
- 深入研究Clang(十五) Clang的RISCV支持1
一.Clang/LLVM对RISCV的支持概况 目前已经有一系列的C类编译器和库开始支持RISCV,这其中包括了GCC和Clang/LLVM.从RISCV的官方网站,可以获取目前的支持状态.具体内容如 ...
- 使用Clang作为编译器 —— Clang 语言扩展
1. 介绍 本文档描述了 Clang 提供的语言扩展.除了这里列出的语言扩展之外,Clang 还旨在支持广泛的 GCC 扩展.有关这些扩展的更多信息,请参阅 GCC手册. 2. 特性检查宏 语言扩展可 ...
- 使用Clang作为编译器 —— Clang 中的Diagnostic flags
Clang 中的Diagnostic flags(未完成) 1. 介绍 2. 诊断标记(Diagnostic flags) 2.1 -W 2.2 -W#pragma-messages 2.3 -W#w ...
- linux下载clang7,clang,linux_ubuntu安装clang依赖报错, 如果降版本安装?,clang,linux - phpStudy...
ubuntu安装clang依赖报错, 如果降版本安装? 我本地的g liu@liu-XPS-13-9343:~/.vim/bundle$ gcc --version gcc (Ubuntu 4.8.4 ...
- 在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi
一.简介 LLVM LLVM(之前称为低级虚拟机Low Level Virtual Machine)是一种非常强大的编译器基础架构框架,专门为使用您喜爱的编程语言编写的程序的编译时.链接时和运行时优化 ...
- Clang:LLVM 的 C 语言家族前端
Clang:LLVM 的 C 语言家族前端 Clang 项目为LLVM 项目的 C 语言家族(C.C++.Objective C/C++.OpenCL.CUDA 和 RenderScript)中,提供 ...
- 编译器GCC与Clang的异同
GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键 ...
- c 各种编译器(gcc clang)
很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透 ...
最新文章
- 苹果7信号天线内部位置_新专利显示未来Apple Watch Wi-Fi及无线天线或将嵌入显示屏中...
- 树莓派 | threading01 - 创建两个子线程同时运行,两个线程各负责控制一个LED灯以不同的频率闪烁
- mysql配置所有ip连接_Mysql查看用户连接数配置及每个IP的请求情况
- Docker搭建RabbitMQ
- 问题:anaconda 中 tensorflow 与tensorflow-gpu 在tf.image.resize_images()上的区别
- 高通似乎成了台积电和三星在先进工艺上暗战主角
- syscall 系统调用陷入_MIPS中的异常处理和系统调用【转】-阿里云开发者社区
- AutoCAD 经典
- 基于内容的图像特征提取系统
- c语言中结构体定义中的“冒号”
- 池化层MaxPool函数详解及反向传播的公式推导
- Pinterest模式的魅力何在?国内山寨有哪些?
- 莫比乌斯反演与整除分块
- 阿里云安装MySQL数据库全过程(适合小白)
- nginx+docker+gunicorn+flask部署到云服务器
- 千与千寻主题曲beep函数版
- 联想笔记本声音太小怎么办_笔记本声音太小,小编告诉你笔记本电脑声音太小解决方法...
- 工作流-jbpm入门例子
- Tensorboard可视化
- dashboard的安装使用