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