结构化编译器前端 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)】。



结构化编译器前端 Clang 介绍

结构化编译器前端 Clang 介绍 http://www.ibm.com/developerworks/cn/opensource/os-cn-clang/...
  • zdy0_2004
  • zdy0_2004
  • 2014年11月19日 17:43
  • 666

结构化编译器前端 Clang 介绍

背景与概览 Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang ( 发音为 /klæŋ/) 是 LLVM 的一个编译...
  • HedpatCzw
  • HedpatCzw
  • 2016年01月24日 13:42
  • 524

结构化编译器前端 Clang 介绍

如何运用 Clang 进行插件开发 Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,Clang 是 LLVM 的一个编译器前端。由于优秀的设计,使得 cla...
  • vloong
  • vloong
  • 2014年02月11日 15:12
  • 666

结构化编译器前端 Clang 介绍

背景与概览 Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang ( 发音为 /klæŋ/) 是 LLVM 的一个...
  • some_do
  • some_do
  • 2015年01月09日 10:26
  • 558

利用LLVM,Clang制作自己的编译器

最近找到国外一大神做的利用LLVM和Clang写的修改源代码的例子,恰好项目需要做一个source-to-source的编译器与此相关,所以部分翻译一下这位大神的文章。 原文地址: http://e...
  • sfdazsdf
  • sfdazsdf
  • 2015年07月20日 22:20
  • 2188

业界编译器Clang介绍

http://baike.baidu.com/link?url=2cAQ-ZePNxPoPNll06fdZKaG5oSOpAhfmCoJ5hIS1sBG1Psy9c8wlcguVAsronSVYDc5...
  • zhongyunde
  • zhongyunde
  • 2015年09月20日 18:02
  • 683

GCC,LLVM,Clang编译器对比

文章来源:http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中,我们经常会看到这些编译选项(如下图)...
  • LANGZI7758521
  • LANGZI7758521
  • 2016年09月09日 16:27
  • 1087

Ubuntu系统下通过Clang编译器编写Objective-C

Objective-C作为Apple的first-class编程语言,在很长一段时间内都得到大量开发者的追捧。其中,Objective-C对C语言的完全兼容、灵活性以及OOP特性,使得它成为一门十分优...
  • zenny_chen
  • zenny_chen
  • 2016年09月11日 23:39
  • 2237

gcc编译器---前端和后端

GCC编译器由编译预处理组件cpp和针对特定语言的编译器cc1组成
  • u012491514
  • u012491514
  • 2014年05月04日 18:31
  • 2361

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

Clang是LLVM框架中的重要前端,深入理解Clang,首先要搞清楚的是它和LLVM的关系,之后要搞清楚的是它的架构。只有这两个问题搞清楚了,才可以真正的深入下去。...
  • snsn1984
  • snsn1984
  • 2013年12月31日 15:53
  • 29555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:结构化编译器前端 Clang 介绍
举报原因:
原因补充:

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