AST(抽象语法树)解析
概念
抽象语法树(Abstract Syntax Tree,简称 AST)是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都代表着源代码的一部分。在代码编译、代码转换、代码分析等场景中,AST 都发挥着重要作用。
解析过程
AST 的解析过程主要分为词法分析和语法分析两个阶段:
- 词法分析(Lexical Analysis):也称为扫描(Scanning),词法分析器会将源代码作为输入,把它拆分成一个个的词法单元(Token)。例如,对于代码
let num = 10;
,词法分析器会将其拆分为let
、num
、=
、10
、;
这些词法单元。 - 语法分析(Syntactic Analysis):语法分析器会接收词法分析器输出的词法单元,根据编程语言的语法规则,将这些词法单元组合成 AST。在这个过程中,语法分析器会检查代码是否符合语法规则,如果不符合则会抛出语法错误。
AST使用场景
- 代码编译与解释:编译器借助AST,能够更高效地对代码进行分析与优化。
- 代码静态分析:在不运行程序的前提下,对代码的质量和潜在问题进行检查,像代码格式化工具、代码检查工具等都会用到(Eslint,Prettier,自定义)。
- 代码转换与重构:可以对AST进行修改,进而生成新的代码(babel , less , 构建工具 , 压缩与混淆 , 自定义转换方式 )
示例
对于JavaScript代码function add(a, b) { return a + b; }
,其简化后的AST可能呈现为:
{
"type": "FunctionDeclaration",
"id": { "type": "Identifier", "name": "add" },
"params": [
{ "type": "Identifier", "name": "a" },
{ "type": "Identifier", "name": "b" }
],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "ReturnStatement",
"argument": {
"type": "BinaryExpression",
"operator": "+",
"left": { "type": "Identifier", "name": "a" },
"right": { "type": "Identifier", "name": "b" }
}
}
]
}
}