抽象语法树

概念:

抽象语法树(abstract syntax code,AST)是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说语法是’抽象’的,是因为这里的语法不会表示出真实语法中出现的每个细节。

在这里先补充一个概念:具象语法树(Concret Syntax Tree, 简称CST)。
什么是具象语法树呢?
我们知道一颗解析树是包含代码所有语法信息的树形结构,它是代码的直接翻译,所以解析树也被称为具象语法树。抽象语法树实际只是解析树的一个精简版。

避免混淆,我们来简化一下概念:

解析树 = CST = 具象语法树
抽象语法树 = AST

那么抽象语法树到底是什么样的呢?我们可以来看一个简单的例子:

我们来写一段最简单js代码 20 + (15 - 3)*2,没错,这是一个简单的四则运算表达式,那么它的抽象语法树应该表现为什么样呢,在看AST(抽象语法树)之前,我们先来看一下它的解析树:

Java 抽象语法树 AST 抽象语法分析树_树形结构


但是我们看到这样的一颗解析树显然是有些冗余的,那么我们可不可以对这颗解析树去繁取简呢,当然是可以的:

Java 抽象语法树 AST 抽象语法分析树_语法树_02

这里我们得到了一棵最简洁的树,去除了冗余的描述和符号,很直观的就可以看出树上每一个阶段节点之间的关系,从而也更能容易的推断出原表达式的样子,此时我们所得到的这颗树就是我们最终要得到的 20 + (15 - 3)*2 表达式的抽象语法树。

这里只是简单的对抽象语法树概念的简单理解,当然还有从分析树到抽象语法树的具体的转化过程以及具体的表现形式,如果有需要请自行查阅相关资料。