浅析AST抽象语法树及Python代码实现
在计算机科学中,抽象语法树(abstractsyntaxtree或者缩写为AST),或者语法树(syntaxtree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。
和抽象语法树相对的是具体语法树(concretesyntaxtree),通常称作分析树(parsetree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。
抽象语法树的结构不依赖于源语言的文法,也就是语法分析阶段所采用的上下文无关文法。因为在Parser工程中,经常会对文法进行等价的转换(消除左递归、回溯、二义性等),这样会给文法引入一些多余的成分,对后续阶段造成不利影响,甚至会使各阶段变得混乱。因此,很多编译器(包括GJC)经常要独立地构造语法分析树,为前、后端建立一个清晰的接口。
Python实现
假设对'a+3*b'进行解释,其中a=2,b=5
代码很简单,就不再进行详细的解释了。
Num=lambdaenv,n:n Var=lambdaenv,x:env[x] Add=lambdaenv,a,b:_eval(env,a)+_eval(env,b) Mul=lambdaenv,a,b:_eval(env,a)*_eval(env,b) _eval=lambdaenv,expr:expr[0](env,*expr[1:]) env={'a':2,'b':5} tree=(Add,(Var,'a'), (Mul,(Num,3), (Var,'b'))) print_eval(env,tree)
输出结果为17