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,有些类同时派生自 DeclDeclContext

AST 中还有许多节点不是更大层次结构的一部分,只能从特定的其他节点访问,比如 CXXBaseSpecifier。

因此,要遍历整个 AST,首先从 TranslationUnitDecl 开始,然后递归遍历从该节点可以到达的所有内容 —— 必须为每个特定的节点类型编码此信息。这个算法是在 RecursiveASTVisitor 中编码的。请参阅 RecursiveASTVisitor 教程。

Clang AST中最基本的两个节点是语句(Stmt)和声明(Decl)。注意:表达式(Expr)也是 Clang AST 中的语句。

使用Clang作为库 —— Clang AST相关推荐

  1. 使用Clang作为库 —— Clang Plugins

    Clang Plugins 1. 介绍 2. 编写一个PluginASTAction 3. 注册一个plugin 4. 定义pragmas 5. 把它们放在一起 6. 运行此plugin 6.1 使用 ...

  2. 深入研究Clang(十五) Clang的RISCV支持1

    一.Clang/LLVM对RISCV的支持概况 目前已经有一系列的C类编译器和库开始支持RISCV,这其中包括了GCC和Clang/LLVM.从RISCV的官方网站,可以获取目前的支持状态.具体内容如 ...

  3. 使用Clang作为编译器 —— Clang 语言扩展

    1. 介绍 本文档描述了 Clang 提供的语言扩展.除了这里列出的语言扩展之外,Clang 还旨在支持广泛的 GCC 扩展.有关这些扩展的更多信息,请参阅 GCC手册. 2. 特性检查宏 语言扩展可 ...

  4. 使用Clang作为编译器 —— Clang 中的Diagnostic flags

    Clang 中的Diagnostic flags(未完成) 1. 介绍 2. 诊断标记(Diagnostic flags) 2.1 -W 2.2 -W#pragma-messages 2.3 -W#w ...

  5. 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 ...

  6. 在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi

    一.简介 LLVM LLVM(之前称为低级虚拟机Low Level Virtual Machine)是一种非常强大的编译器基础架构框架,专门为使用您喜爱的编程语言编写的程序的编译时.链接时和运行时优化 ...

  7. Clang:LLVM 的 C 语言家族前端

    Clang:LLVM 的 C 语言家族前端 Clang 项目为LLVM 项目的 C 语言家族(C.C++.Objective C/C++.OpenCL.CUDA 和 RenderScript)中,提供 ...

  8. 编译器GCC与Clang的异同

    GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键 ...

  9. c 各种编译器(gcc clang)

    很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透 ...

最新文章

  1. 苹果7信号天线内部位置_新专利显示未来Apple Watch Wi-Fi及无线天线或将嵌入显示屏中...
  2. 树莓派 | threading01 - 创建两个子线程同时运行,两个线程各负责控制一个LED灯以不同的频率闪烁
  3. mysql配置所有ip连接_Mysql查看用户连接数配置及每个IP的请求情况
  4. Docker搭建RabbitMQ
  5. 问题:anaconda 中 tensorflow 与tensorflow-gpu 在tf.image.resize_images()上的区别
  6. 高通似乎成了台积电和三星在先进工艺上暗战主角
  7. syscall 系统调用陷入_MIPS中的异常处理和系统调用【转】-阿里云开发者社区
  8. AutoCAD 经典
  9. 基于内容的图像特征提取系统
  10. c语言中结构体定义中的“冒号”
  11. 池化层MaxPool函数详解及反向传播的公式推导
  12. Pinterest模式的魅力何在?国内山寨有哪些?
  13. 莫比乌斯反演与整除分块
  14. 阿里云安装MySQL数据库全过程(适合小白)
  15. nginx+docker+gunicorn+flask部署到云服务器
  16. 千与千寻主题曲beep函数版
  17. 联想笔记本声音太小怎么办_笔记本声音太小,小编告诉你笔记本电脑声音太小解决方法...
  18. 工作流-jbpm入门例子
  19. Tensorboard可视化
  20. dashboard的安装使用

热门文章

  1. 中国力量给力巴塞罗那 中兴“light”全系闪耀
  2. UNIX SOCKET简介
  3. 领投有来医生,百度健康下了盘什么棋?
  4. 我对计算机网络的期待,锐龙版联想720s:实现我对13寸笔记本的所有期待
  5. java utc 转换pst_Python将UTC转换为PST/PDT格式
  6. 谁说了真话,谁打碎了花瓶
  7. 英语语音篇 - 语音语调
  8. 【笔记】谷歌地球高清影像下载、制图
  9. 信号之SIGCHLD
  10. jq循环定时器动态切换网站标题