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(二)Abstract Syntax Tree

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

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

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

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

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

【eclipse高效开发】——eclipse AST(抽象语法树)简介

Eclipse AST 什么是AST?  是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。抽象语法树(Abstract Sy...

ANTLR中抽象语法树(AST)的生成和使用

ANTLR中抽象语法树(AST)的生成和使用直接在语法文件中嵌入求值处理代码的方式在ANTLR中称为嵌入式动作。复杂情况下需要基于语法树遍历生成目标代码。前者语法复杂时使语法文件臃肿。另外,语法可能经...
  • vanloon
  • vanloon
  • 2011年02月17日 16:43
  • 9001

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

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

基于AST抽象语法树的SQL注入检测 (2) -- 每周小结(01-02~01-08) - .Little Hann

本周继续学习AST的SQL语法检测原理的学习,文章的接下来部分准备分为2部分进行学习: 1. SQL注入语法防御规则 2. druid中SQL注入防御模块sql-wall 1. 相关学...

【转】抽象语法树简介(AST)

引用地址:http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstr...

自制脚本语言(10) 抽象语法树AST与三地址线性IR

摘要:介绍了自制语言YFlang的AST及IR表示
  • nklofy
  • nklofy
  • 2016年04月12日 22:33
  • 847

C 语言 抽象语法树AST

引用地址:http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract synta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Clang之语法抽象树AST
举报原因:
原因补充:

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