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

抽象语法树:AbstractSyntaxTreesphp

 

定义(wiki):html

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

和抽象语法树相对的是具体语法树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

我的理解:app

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

 

-------------------------------ide

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

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

具体语法树:

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

相关文章
相关标签/搜索