【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树
抽象语法树:AbstractSyntaxTrees
定义(wiki):
在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。
和抽象语法树相对的是具体语法树(concrete syntax tree),通常称作分析树(parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。
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;
包含了:
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;
忽略那些对分析没有帮助的符号,标点等信息。
从CST到AST:
解析器通常直接构建AST或者是先构建CST,然后把CST转换成AST。
int* arp[5];
这里有两个问题使得分析变得困难:
1. 通常我们都是先申明一个数组,然后再用一个指针指向这个数组。但是在CST中,指针(pointer)节点在数组之上。不易理解。
2. 数组名在叶子节点上,用起来不方便。
因为CST的这两个问题,pycparser并不通过CST去生成AST,而是直接生成AST:
int* arp[5];
在AST中,pointer节点在array节点之下,并且变量名也容易读取。
-------------------------------
如何生成抽象语法树?(以Java为例,详见http://www.cnblogs.com/XBWer/p/7256288.html)
If you have any questions about this article, welcome to leave a message on the message board.
Brad(Bowen) Xu
E-Mail : maxxbw1992@gmail.com