Clang之语法抽象树AST

转载 2016年11月09日 14:28:35


       语法分析器的任务是确定某个单词流是否能够与源语言的语法适配,即设定一个称之为上下文无关语言(context-free language)的语言集合,语法分析器建立一颗与(词法分析出的)输入单词流对应的正确语法树。语法分析树的建立过程主要有两种方法:自顶向下语法分析法和自底向上分析法。AST作为语法分析树(parse tree)的一种简写方式,它独立于具体编程语言(C++、Java、C等),而且与语法分析树的建立过程无关(自顶向下和自底向上逻辑等价),是联系编译器前端、后端的重要接口。Clang的AST树与其他一些AST有些区别,如前者括号表达式为未裁剪模式(in an unreduced form),后者一般会尽量省去多余的括号,这样方便建立重构工具(clang\docs\IntroductionToTheClangAST.rst中说明)。

一、AST的直观印象

 可以使用clang –emit-ast input.cpp生成AST的二进制文件input.ast,也可以直接打印输出如下:

参考链接:

http://www.cnblogs.com/zhangke007/p/4714245.html

除了main函数,部分代码:

class Visitor : public RecursiveASTVisitor < Visitor > {
public:
	virtual bool VisitDecl(Decl *decl){
		if (decl)
		cout << "Visit Decl !" << endl;
		return true;
	}
	virtual bool VisitNamedDecl(NamedDecl *decl){
		if (decl)
		{
			cout << "Visit NamedDecl :" << decl->getQualifiedNameAsString() << endl;
		}
		return true;
	}
	virtual bool VisitNamespaceDecl(NamespaceDecl *decl){
		if (decl){
			cout << "Visit NamespaceDecl:" << decl->getQualifiedNameAsString() << endl;
		}
		return true;
	}
};

class MyASTConsumer : public ASTConsumer{
	bool HandleTopLevelDecl(DeclGroupRef DR) override{
		for (DeclGroupRef::iterator it = DR.begin(); it != DR.end(); ++it){
			visitor.TraverseDecl(*it);
			(*it)->dump(); //打印AST nodes
		}
		return true;
	}
private:
	Visitor visitor;
};

class MyFrontendAction : public ASTFrontendAction{
public:
	MyFrontendAction(){}
	unique_ptr<ASTConsumer>CreateASTConsumer(CompilerInstance &CI, StringRef file)override{
		llvm::errs()<< "Create ASTConsumer for " << file << "\n";
		return llvm::make_unique<MyASTConsumer>();
	}
};


CLANG技术分享系列一:编写你的第一个CLANG插件

转:http://kangwang1988.github.io/blog/ 引子 以前遇到一个需求,检测iOS App代码中使用到的API是否存在开始支持的系统版本高于当前deplo...
  • bluefish89
  • bluefish89
  • 2017-09-06 16:34:20
  • 550

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

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

基于Clang的Source to Source源代码转换(一)

Clang中包含了非常多的关于抽象语法树(AST)的访问和操作的类和接口。我们程序开发人员可以直接通过继承其中的某些类,重写其中的关键成员方法,从而形成我们自己的对抽象语法树的操作。 那么,首先我们简...
  • talentedlas
  • talentedlas
  • 2016-07-24 15:45:39
  • 1031

Clang AST 介绍 (updating)

Clang AST 的介绍 这篇文章介绍了一片温柔的序曲关于 Clang AST 的神秘。这个针对于那写想对clang 有贡献的开发者,或是那些使用基于Clang 的AST 工具,如 AST匹配器。 ...
  • dongjideyu
  • dongjideyu
  • 2013-11-19 17:40:01
  • 3151

深入研究Clang(三) libclang

libclang是一个提供了C接口的一个库,它让你可以轻松的把clang作为一个库去使用,这样的做法带来了很多的有点,且看本文的一点小论。...
  • snsn1984
  • snsn1984
  • 2014-05-15 14:22:27
  • 10261

Clang插件学习 Clang插件常用API

1.定义一个plugin子类头文件#ifndef MyPlugin_hpp #define MyPlugin_hpp#include #include #include #include#includ...
  • taishanduba
  • taishanduba
  • 2017-03-03 00:49:44
  • 657

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

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

深入研究Clang(二)Abstract Syntax Tree

AST,抽象语法树,这是编译理论中的基础知识,是深入学习任何编译器所无法逾越的一个坎,所以必须要对它熟悉。本文列出了需要学习的两个文档,并且对AST进行了简单的介绍和总结。...
  • snsn1984
  • snsn1984
  • 2014-01-07 16:01:11
  • 7494

Clang 静态分析(Static Analyzer)工具使用的总结

woogle原创,转载注明出处。 Clang作为LLVM(LowLevel VirtualMachine)编译器框架的前端,可以将C/C++、O-C/O-C++语言编译成为LLVM的中间表达式IR...
  • beswkwangbo
  • beswkwangbo
  • 2015-10-16 15:34:31
  • 2349

clang static analyzer源码分析(一)

引子clang静态代码分析是clang相对于gcc一个比较能够引起关注的点,特别是clang静态代码分析基于checker的架构和大部分的静态分析工具都不相同。clang静态代码分析使用符号执行的技术...
  • dashuniuniu
  • dashuniuniu
  • 2016-03-01 18:10:50
  • 5416
收藏助手
不良信息举报
您举报文章:Clang之语法抽象树AST
举报原因:
原因补充:

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