-
Notifications
You must be signed in to change notification settings - Fork 20
Open
Description
概述
抽象语法树是源代码和机器代码的中间表示形式。
它有如下作用:
- 代码语法的检查
- 代码风格的检查
- 代码的格式化
- 代码的高亮
- 代码错误提示
- 代码自动补全
比如webpack就是把JS文件解析成抽象语法树,然后使用loader和plugin处理这个抽象语法树,最后把抽象语法树输出成跟源JS代码略有不同的JS代码。
编译原理
- 分词/词法分析,把字符串分解成有意义的代码块,这些代码块被称为词法单元
- 解析/语法分析,词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树
- 代码生成,将 AST 转换为可执行代码
结构
AST 的格式每种 Parser 都有各自的标准。
一般抽象语法树都会有一个Node接口:
interface Node {
type: string;
}
Node节点都会有几个属性:
- 表示类型,type(一般分为两大类:语句和表达式。)
- 表示代码起始位置,start、end、loc
不同的类型的Node节点会有不一样的属性,比如:
- 声明类型语句,type: VariableDeclaration,会有declaration、kind属性。
- 表达式,type: ExpressionStatement,会有expression属性。
相关库
- esprima,把源码解析成AST。
- escodegen,把AST输出为源码。
- babel的解析器@babel/parser是基于babylon的。
参考
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels