【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树

抽象语法树:AbstractSyntaxTrees

 

定义(wiki):

计算机科学中,抽象语法树abstract syntax tree或者缩写为AST),或者语法树syntax tree),源代码的抽象语法结构的状表现形式,这里特指编程语言源代码。树上的每个节点都表示源代码中的一种结构之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。

和抽象语法树相对的是具体语法树concrete syntax tree),通常称作分析树parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

NewImage

An abstract syntax tree for the following code for the Euclidean algorithm:

 

while b ≠ 0
if a > b
a := a − b
else
b := b − a
return a

个人理解:

语法树就是对程序进行语法分析的产物。

 

-------------------------------

引自:https://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees/#id4

具体语法树(Concrete Syntax Trees,CST) vs 抽象语法树(Abstract Syntax Trees,AST)

具体语法树:

A parse tree pictorially shows how the start symbol of a grammar derives a string in the language.

 

return a + 2;

 

 

NewImage

包含了:

additive expression

multiplicative expression

cast expression

unary expression

assignment expression

conditional expression

 

抽象语法树:

Abstract syntax trees, or simply syntax trees, differ from parse trees because superficial distinctions of form, unimportant for translation, do not appear in syntax trees.

 

return a + 2;

 

 

 

NewImage 

忽略那些对分析没有帮助的符号,标点等信息。

 

从CST到AST:

解析器通常直接构建AST或者是先构建CST,然后把CST转换成AST。

 int* arp[5];

 

 

NewImage

这里有两个问题使得分析变得困难:
1. 通常我们都是先申明一个数组,然后再用一个指针指向这个数组。但是在CST中,指针(pointer)节点在数组之上。不易理解。
2. 数组名在叶子节点上,用起来不方便。
因为CST的这两个问题,pycparser并不通过CST去生成AST,而是直接生成AST:

 

int* arp[5];

 

 

NewImage

在AST中,pointer节点在array节点之下,并且变量名也容易读取。

------------------------------- 

 

 如何生成抽象语法树?(以Java为例,详见http://www.cnblogs.com/XBWer/p/7256288.html

posted @ 2017-11-28 13:13  max_xbw  阅读(735)  评论(0编辑  收藏  举报