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的Source to Source源代码转换(一)

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

编译器架构的王者LLVM——(5)语法树模型的基本结构

上次我们看了Lex和Yacc的翻译文件,可能一些朋友并不了解其中的执行部分,而且,对这个抽象语法树是怎么构建起来的还不清楚。今天我们就再详细介绍一下如果方便的构建一棵抽象语法树(AST)...
  • sun_xiaofan
  • sun_xiaofan
  • 2015年11月10日 12:01
  • 3536

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

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

从Swift桥接文件到Clang-LLVM

前言今天在Swift工程中不小心创建了一个OC文件,于是乎提示我创建一个桥接文件,那么为什么需要创建桥接文件呢,它的原理又是什么呢?打开百度一搜,全是教你怎么创建桥接文件的,似乎找不到答案~LVVM ...
  • u014795020
  • u014795020
  • 2017年05月19日 02:09
  • 593

AST-抽象语法树

转自:http://blog.csdn.net/philosophyatmath/article/details/38170131 抽象语法树简介 (一)简介 抽象语法树(abs...
  • cmdssd1
  • cmdssd1
  • 2015年05月14日 09:49
  • 3687

AST 抽象语法树学习

阅读原文Abstract Syntax Tree 抽象语法树简介在使用前端许多工具插件的时候,我们大多知道每个工具库、每个插件能做什么,不过很多同学其实并不清楚背后用到的技术,如webpack、rol...
  • Dear_Mr
  • Dear_Mr
  • 2017年05月20日 21:01
  • 3236

CLANG技术分享系列三:API有效性检查

CLANG技术分享系列三:API有效性检查 01 NOV 2016 . CATEGORY: TECH . COMMENTS  #CLANG 问题背景 iOS API(Clas...
  • bluefish89
  • bluefish89
  • 2017年09月06日 16:39
  • 112

LLVM 与 Clang介绍

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://qikee.blogbus.com/logs/113687683.html LLVM...
  • ningxialieri
  • ningxialieri
  • 2011年11月24日 16:48
  • 1597

从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化)

从嵌套表达式谈抽象语法树(AST)到平台无关中间指令(IR)的翻译过程(线性化) #一些想到的东西: ## 要掌握编译器前端Parser的语法解析是怎么回事,不需要用完整的C语...
  • cteng
  • cteng
  • 2016年04月26日 22:23
  • 1006

clang static analyzer源码分析(二)

clang static analyzer源码分析(二),主要介绍ExplodedGraph的概念以及对clang static analyzer进行调试...
  • dashuniuniu
  • dashuniuniu
  • 2016年09月05日 10:12
  • 1937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Clang之语法抽象树AST
举报原因:
原因补充:

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