自学内容网 自学内容网

AST抽象语法树

一、为什么要有AST语法树:

使用的语言一般都有一个主入口函数,比如main函数。简单的说调用过程就是,调用main函数然后再调用不同的函数,层层调用下去然后执行完毕最后返回,这一想就知道肯定是个树的结构。但是对于一个代码文件来说,在我们面前的只是一个文本文件而已。我们虽然知道def,fuction,fuc代表函数定义/调用,但是需要让计算机知道它确实如此。所以需要一个结构,表示解析出来的整个代码文件的结构,用于让编程语言理解,这个结构通常使用AST语法树。通过它,编程语言就知道,这个代码文件里字符串代表的是什么含义,是函数定义,函数表达式,还是是变量,还是是计算表达式。

二、阶段:词法分析、语法分析、语义分析

1、词法解析:

将字符串文本中识别出每个最小对象,关键字比如:class、fuc、while、if、let、var,interger等,每一个被解析出来的词被叫做token。

2、语法解析:

根据词法解析和字符串文本,生成一个树形结构。节点可能是函数,函数体里可能有另一个函数调用存储,存储局部变量地方。变量可以用map存储,调用的函数可以用list。这个自己设计就好

3、语义分析:

①建立符号表:根据语法解析出来的树建立符号表

名称:变量名称、类名称和函数名称等;
符号种类:也就是变量(需要用到作用域的语言,根据关键字标注一下是局部还是全局作用域就好了)、函数、类等;
其他必要的信息:如函数的签名、变量的类型、类的成员,等等。

②引用消解:

在函数体中比如,函数A中调用了函数B,需要知道函数B是哪一个函数。比如A中参数就叫是哪个变量。那么这些函数、变量的寻找通过刚才建立的符号表就可以寻找到

③其他检测:比如有的语言需要类型检测。

三、这样:一个代码的整个结构就结构化的展现在了编程语言/解释器/虚拟机面前了,为整个代码的真正执行做了准备。

四、运行:

AST其实也可以执行的,知道把后端写好。最暴力的就是直接一层一层执行了。但是为了支持作用域,还是在每个函数调用的时候创建一个栈是数据结构,层层压栈出栈完成。
但是效率比较低而已,运行时需要消耗更多的 CPU 时间和内存。比如递归。只是做一个表达式求值,也要层层做很多次的函数调用。还有就是处理continue,break,return语句时候不太方便。所以很多语言都有虚拟机。比如java,python。


原文地址:https://blog.csdn.net/w1234567465/article/details/142708436

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!