AST 抽象语法树
什么是AST?
是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于
if-condition-then
这样的条件跳转语句,可以使用带有三个分支的节点来表示。
– From wiki
AST是代码片段具体语义的抽象表达可以与目标代码之间相互转换的一种中间状态。
Javascript Compiler
我们最常用的Javascript compiler babel首页是这样描述的。
Babel is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments. Here are the main things Babel can do for you:
- Transform syntax
- Polyfill features that are missing in your target environment (through @babel/polyfill)
- Source code transformations (codemods)
- And more! (check out these videos for inspiration)
babel 的 parser traverse是基于Ecmascript标准实现的,很重要的一点就是其中节点类型。
以下是 ECMAScript支持的词法类型.
AST的数据结构
了解一个parser的结构,以及parser解析语法所依赖的规则后,接下来,我们需要了解一下一个parser所生产出来的结果——抽象语法树。在文章的开头,我有简单的解释抽象语法树即是具体代码片段的抽象表达,那它具体是长什么样的呢?
1 | function sayHi() { |
以上的代码片段,AST树结构如下:
1 | { |
AST将标识符(identifier)、表达式(expression)、语句(statement)等抽象成为树状结构。
实现一个简单的 parser
Lever.ts
1 | import {IHelper} from "./helper"; |
Parser.ts
1 | import Lexer from "./lexer"; |