使用Clang作为库 —— Clang AST

2023-11-05


本文为译文,点击 此处查看原文。

本文档温和地介绍了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 节点是基于没有公共祖先的类层次结构建模的。相反,对于像 DeclStmt 这样的基本节点类型,有多个更大的层次结构。许多重要的AST节点派生自 TypeDeclDeclContextStmt,有些类同时派生自 DeclDeclContext

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Clang作为库 —— Clang AST 的相关文章

随机推荐

  • 数据库课程设计 医院管理系统 SQL

    文章目录 一 背景资料 需求分析 二 功能模块 三 功能设计说明书 要求详细描述各模块功能 给出模块结构图 SC图 四 数据库设计 1 概念模型 图 2 逻辑模型 五 建表以及sql语句 1 病人表 2 医生表 3 科室表 4 病房表 六
  • JDBC连接Mysql长时间无动作连接失效

    错误场景介绍 做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池 用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份 按照月份 操作 但是发现当一个一段时间 较长 没
  • 零基础ros基于arduino键盘控制小车(2)

    1上传下位机程序 上传成功后 打开窗口监视器 输入m 20 20来进行测试 e键来检测编码器的值 r键复原 调试的过程在这里便不废话了 2上传上位机程序 2 1 见网上大多数是输入以下指令来查看当前可用窗口 ls dev tty 我是直接打
  • Error 11 No resource identifier found for attribute 'textAlignment' in package 'android' 问题解决

    遇到这个问题是因为最近在做融云及时通讯 当导入moudle后 在编译就出现了这个问题 刚开始在百度上搜 提示要把target api level 改为19 改完之后还是报同样的错误 然后就认为不是这个地方的原因 在别的地方找了好久也没找到
  • 【图文详解】入职必备——SVN使用教程

    一 SVN基本操作 1 进入svnbucket官网 创建一个空项目 学习svn 2 创建好测试项目后 复制对应地址 3 右键点击 SVN 检出 4 粘贴 版本库URL 填写 检出至目录 最后点击 确定 5 完善 用户名 和 密码 同svnb
  • SpringBoot系列--自定义Starter

    提到Spring Boot时 很多人想到的是它的自动化装配特性 当我们项目需要Redis MongoDB时 只需要引入相应的 spring boot starter data redis spring boot starter data m
  • log库spdlog简介及使用

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 code地址在 https github com gabime spdlog 目前最新的发布版本为0 14 0 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能
  • 程序员常用在线工具网址

    online tools 1 字符串长度计算 https www toolbaba cn d dev str count 2 在线sha加密工具 http tools jb51 net password sha encode 3 在线进制转
  • Opencv通过颜色区分电线

    Opencv检测不同颜色的电线是否接好 机器视觉检测物体要根据检测对象的特征找到最方便快捷的方法 最近做了一个靠颜色像素来区分电线的小项目 颜色区分是inRange方法 这个方法检测的是HSV彩色图像的范围 需要将图像转换为HSV图像 如图
  • 深入剖析Tomcat原理

    深入剖析Tomcat原理 一 Tomcat源码部署和运行 intellij IDEA 1 下载tomcat源码 以tomcat 8为例 链接 https tomcat apache org 2 源码部署到IDEA中 创建新的空工程 解压源码
  • vue可视化拖拽生成工具_推荐这几个数据大屏可视化开发工具

    前沿 最近有需求开始接触数据可视化的开发 前期调研和体验了国内几家比较大的数据可视化解决方案提供商 并对开发中会涉及到一些工具做了筛选 经常在社区看到有小伙伴反馈相关方面的需求 于是借此机会把我整理的一些工具分享出来 后期开发完成再针对整个
  • 华为OD机试真题-快递投放【2023.Q1】

    题目描述 有N个快递站点用字符串标识 某些站点之间有道路连接 每个站点有一些包裹要运输 每个站点间的包裹不重复 路上有检查站会导致部分货物无法通行 计算哪些货物无法正常投递 输入描述 1 第一行输入M N M个包裹N个道路信息 2 0 lt
  • C语言经典100例题(40)-- 将一个数组逆序输出

    目录 题目 问题分析 代码 测试结果 欢迎各位大佬 题目 将一个数组逆序输出 问题分析 第一种方法 直接从最后一个元素进行输出即可 倒着输出 第二种方法 将数组的第一个元素与最后一个元素交换 依次类推 然后正顺序输出 代码 第一种方法 in
  • Linux 网络协议栈开发(二)—— 二层桥转发基础

    做为网络设备 二层转发是最基本的功能 要想继续学习linux 内核协议栈 必须明白二层转发的流程 这篇文章举例讲一讲二层转发的流程 二层转发是根据报文的目的MAC直接进行转发 转发过程中不用对报文的头部做任何的修改 三层转发是根据报文的ip
  • 关于:selenium.common.exceptions.WebDriverException: Message: unknown error: cannot get automation exte

    太阳照常升起 脚本依旧还是昨天的脚本 为啥今天就报错了呢 先说明下哪里报错了 当我想要maximize window 时 报错 selenium common exceptions WebDriverException Message un
  • vscode开发java项目简单版

    VS Code 是一个轻量级的代码编辑器 它提供了丰富的扩展生态系统和内置的开发工具 可以支持多种语言和开发平台 Java 是一种流行的编程语言 可以用于开发各种类型的应用程序 下面是在VS Code 中开发Java 项目的基本步骤 安装J
  • java根据word模板生成文档(含文本替换和动态生成表格)

    开发功能需求 给定word模板 word模板中存在 XXX 格式的需要变量替换的一些词 包括直接可以被替换的词 需要循环获取 替换 格式处理的词 例如根据数据库存储内容循环生成表格 模板中还可能会有需要自动增行的表格 1 用到的依赖
  • 对话AI创作助手,它的回答,惊艳到我了。

    1 与AI创作助手的对话 ChatGPT是一个开源的Python库 可以用于构建基于GPT模型的聊天机器人 它使用开放式AI技术 可以适应大量的训练数据 并且可以自动学习用户的对话方式 以下是从测试角度聊一聊ChatGPT的内容 1 测试C
  • 【解决】默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

    出处 http blog csdn net iesneaker article details 6524459 警告信息如下 1 gt LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 请使用 NODEFA
  • 使用Clang作为库 —— Clang AST

    Clang AST 1 介绍 2 检查AST 3 AST Context 4 AST节点 本文为译文 点击 此处查看原文 本文档温和地介绍了Clang AST的神秘之处 主要针对那些希望为Clang做贡献的开发人员 或者使用基于Clang