结构化编译器前端 Clang 介绍

转载 2016年11月10日 10:41:06


http://www.ibm.com/developerworks/cn/opensource/os-cn-clang/

RecursiveASTVisitor,这是一个重要的函数模板。通过介绍这个模板,我们将向您简单介绍遍历抽象语法树的一些基本概念。

RecursiveASTVisitor 是一个深度优先遍历 AST 和访问节点的类。对于一个已经构造好的语法树,它将完成以下三方面的工作:

  1. 遍历 AST 的每个节点;
  2. 在某一个节点,访问这个节点的层次结构 ( 每个节点也是一个树 );
  3. 如果某一个节点是一种类型的动态类别 ( 比如是一个子类等 ),调用一个用户重载的函数来访问这个节点;

上述工作由下面三组方法完成,分别是:

  1. TraverseDecl(Decl *x) 完成工作 1,它是遍历 AST 的入口。这个方法是用来访问有关变量和函数的声明。TraverseDecl 只是简单的根据节点的类型来调用相应的 TraverseFoo(Foo *x),然后递归访问 x 的子节点。TraverseStmt(Stmt *x) 和 TraverseType(QualType x) 则是用来访问一条语句和一个类型的(如结构体),它们的工作方式和 TraverseDecl 类似。
  2. WalkUpFromFoo(Foo *x) 完成工作 2。它不会尝试访问 x 的任何子节点,而是先调用 WalkUpFromBar(x),其中 Bar 是 Foo 的直接父类(除非 Foo 没有父类), 然后调用 VisitFoo(x)。
  3. VisitFoo(Foo *x)完成工作 3。

上述三组方法是分层次的 (Traverse* > WalkUpFrom * > Visit*)。一个方法 ( 如 Traverse*) 可以调用同一层次的方法 ( 例如其他 Traverse*) 或低一层次的方法 ( 如 WalkUpFrom*),它不能调用更高层次的方法。这个结构确保同样类型的 AST 节点会被同时访问,也就是说不会出现交替访问不同节点的情况。


使用方法: 申明一个类A,时期继承模板类RecursiveASTVisitor<A>,当需要访问某种节点时,就重载函数VisitXXX(XXX b)【如VisitNameDecl(NameDecl)】。



ES6/7 + Babel 编译器

ES6/7 + Babel 编辑器
  • 2017年03月24日 15:40

Tensorflow的StreamExecutor编程

首先了解一下结构化编译器前端Clang。 背景与概览 Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang ( 发音...
  • langb2014
  • langb2014
  • 2017-05-16 14:42:25
  • 1107

llvm之clang前端的一些例子:

这是我第一次写博客,最近刚刚接触llvm,写这篇blog主要是边学习边总结,当然有很多理解不到位,甚至是错误的地方。我非常愿意和大家一起探讨,请教llvm的相关知识。llvm之clang前端的一些例子...
  • qq_17722211
  • qq_17722211
  • 2015-09-26 21:11:33
  • 897

clang的使用

macOS 自带了clang编译器。clang是Apple LLVM编译器的一个前端。 http://clang.llvm.org/ 给出了官方的解释:a C language family fron...
  • nigel_lee_beihang
  • nigel_lee_beihang
  • 2016-12-07 15:45:35
  • 1175

深入研究Clang(一)Clang和LLVM的关系及整体架构

Clang是LLVM框架中的重要前端,深入理解Clang,首先要搞清楚的是它和LLVM的关系,之后要搞清楚的是它的架构。只有这两个问题搞清楚了,才可以真正的深入下去。...
  • snsn1984
  • snsn1984
  • 2013-12-31 15:53:19
  • 31688

深入研究Clang(四) Clang编译器的简单分析

首先我们确定下Clang编译器的具体内容和涵盖范围。之前在《LLVM每日谈之二十 Everything && Clang driver 》中曾经提到过,Clang driver(命令行表...
  • snsn1984
  • snsn1984
  • 2014-11-13 14:53:59
  • 16783

clang static analyzer源码分析(一)

引子clang静态代码分析是clang相对于gcc一个比较能够引起关注的点,特别是clang静态代码分析基于checker的架构和大部分的静态分析工具都不相同。clang静态代码分析使用符号执行的技术...
  • dashuniuniu
  • dashuniuniu
  • 2016-03-01 18:10:50
  • 5455

clang 开发应用xcode 编译检查的插件 二:开发篇

1.抽象语法树AST 在实现语法检测之前,需要了解一个叫AST(抽象语法树)的东西 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都...
  • bluefish89
  • bluefish89
  • 2017-09-15 18:24:03
  • 340

关于LLVM,这些东西你必须要知道!

只要你和代码打交道,了解编译器的工作流程和原理定会让你受益无穷,无论是分析程序,还是基于它写自己的插件,甚至学习一门全新的语音。通过本文,将带你了解LLVM,并使用LLVM来完成一些有意思的事情。 ...
  • hypercode
  • hypercode
  • 2016-12-22 16:00:47
  • 1985

深入剖析 iOS 编译 Clang / LLVM

http://www.starming.com/index.php?v=index&view=107 前言 iOS 开发中 Objective-C 和 Swift 都用的是...
  • vincentiss
  • vincentiss
  • 2017-01-19 17:05:35
  • 3158
收藏助手
不良信息举报
您举报文章:结构化编译器前端 Clang 介绍
举报原因:
原因补充:

(最多只允许输入30个字)