当前位置: 首页 > 网络应用技术

了解抽象语法书(AST)

时间:2023-03-05 18:59:55 网络应用技术

  抽象语法树(AST)或语法树是源代码语法结构的抽象表示。它以树状形式的形式表达了编程语言的语法结构。树上的每个节点代表源代码中的结构-Wikipedia。

  在编写下一个代码时,实际上是一个字符串。如何使计算机了解代码的逻辑,例如以下JS代码:

  每种编程语言都有其独特的语法规则,并且编写的代码是一个 - 一个字符。为了让机器读取写作代码,您需要一一读取它们。第一步是将所有这些都放在所有这些中。表达不同字段之间的关系,例如将值分配给x等。上面代码的抽象语法树如下:

  这是以JSON格式表示的。不同解析器的字段名称可能有些不同,但其本质是相同的。

  生成AST的第一步是读取字符串,然后一一识别令牌。例如,下面的JS的代码片段,您需要识别这些徽标(令牌)。这些徽标是分类的,例如保留关键字。它是一个变量,这些运算符。

  然后根据语言的语法规则来安排和分类这些令牌,以形成树结构(AST)。

  在理解该算法之前,让我们首先回顾一些概念。以下是Wikipedia的摘录:

  infix符号(或介质)是一种常见的算术或逻辑公式表示法。操作员以中间点缀的形式处于操作号码的中间。例如:

  波兰符号(或波兰)是逻辑,算术和代数表示的一种方法。它的特征在于操作号码的正面,因此也称为前缀表示形式。

  反向波兰符号(RPN或不良波兰)是波兰数学家Yang Waka Shevich在1920年介绍的一种数学表达方法。BEONSBEHING OPTION操作,也称为后缀表示。例证:示例:示例:

  分流码的算法是将中场表示形式转换为反波兰。

  为什么要使用反向蓬兰?此方法非常易于处理计算机处理。具体的解释不是本文的重点。您可以在此处查看:https://zh.wikipedia.org/wiki/不利流行乐谱法

  这与抽象语法树有什么关系?将一些表示形式放在一起以进行比较

  当一起比较几种方式时,发现实际上是相同的。AST的数据结构只会为每个令牌增加更多属性,以实现更复杂的语法,并且其本质没有改变。

  使用一个示例查看算法的实现:

  1输出1

  *将*放在堆栈1*2输出1 2*+*堆栈输出1 2*中

  +put +在堆栈1 2 * +中2 2 2 2 2 * 10 2-( +)放置 - 堆栈1 2 * 10 2-( +)(从堆栈中出来1 2 * 10 2 - + * * *在堆栈1 2 * 10 2-* +5输出1 1输出1 12* 10 2-5* +结束堆栈中的所有操作符号1 2 10 2-5 +* +to ast to ast to AST非常相似

  如果将其放入堆栈中,然后将其放在堆栈中,则可以构建AST树。尝试一下:

  +二进制表达式从堆栈中输出。它是树的树。发现它是双重操作员,因此将有两个左右子节点*二进制算子堆叠。运算符将有两个节点5节点5个节点5堆栈。堆栈, - 左节点, - ,*子节点已满,返回+节点*二重操作符号,它是+ root节点的左节点,创建两个sub -nodes 2个sub -nodes 2个数字,*右节点1中的堆栈中*,*在左节点的示例中,只有数字和运算符。如果添加了变量,则过程相同,但是类型是不同的。

  AST的应用程序场景非常宽。在编写代码的过程中,它在不知不觉中使用。代码可以转换为AST,也可以将AST转换为代码。以下是某些应用程序方案的示例:

  这是一些JS和TS解析器的实现库

  编译器可以将新的JS语法编译为旧的语法。基本上,为了提高生产率,Babel必须是使用的施工工具的一部分。因此,有必要理解,只需从AST的角度引入。

  预告片主要采取三个步骤完成汇编过程

  这三个过程对应于三个包: @babel/parser, @babel/traverse, @babel/generator

  当时,通常不需要主动调用这些软件包的方法。

  以下是一个简单而直接的示例:

  这是一个非常基本的例子,但它涵盖了Babel的整个作品的基本框架。您可以看到AST在其中的关键作用。

  尽管它很少在正常工作的业务发展中使用,但是当您想制作一些编程工具,编译工具,编写一些Babel或WebPack插件时,因此有必要理解和理解。

  原始:https://juejin.cn/post/7100082653256220686