什么是抽象语法树
抽象语法树(abstract syntax tree,AST,或者简称语法树)是源代码的抽象语法结构的树状表现形式,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
之所以说是抽象的,是因为这里的语法并不会表示出真实语法中出现的每个细节,比如嵌套括号被隐含在树结构中,并不会以节点的形式呈现出来。而类似于if...else
这样的条件语句,可以使用两个分支的节点来表示。
比如下面这段代码:
while (b !== 0) {
if (a > b) {
a = a - b
} else {
b = b - a
}
}
return a;
它的对应的抽象语法树如下:
可以通过astexplorer这个网站,将我们输入的代码转换为AST展示出来,可以展示为书结构,也可以直接以JSON格式展示,比如在左侧输入let a = 123;
,对应的语法树:
也可以直接输入JSON:
{
"type": "Program",
"start": 0,
"end": 12,
"body": [
{
"type": "VariableDeclaration",
"start": 0,
"end": 12,
"declarations": [
{
"type": "VariableDeclarator",
"start": 4,
"end": 11,
"id": {
"type": "Identifier",
"start": 4,
"end": 5,
"name": "a"
},
"init": {
"type": "Literal",
"start": 8,
"end": 11,
"value": 123,
"raw": "123"
}
}
],
"kind": "let"
}
],
"sourceType": "module"
}
语法树中每个元素可以成为一个节点(node),类型包括:
(parameter) node:
Identifier | SimpleLiteral | RegExpLiteral | Program | FunctionDeclaration | FunctionExpression |
ArrowFunctionExpression | SwitchCase | CatchClause | VariableDeclarator | ExpressionStatement |
BlockStatement | EmptyStatement | DebuggerStatement | WithStatement | ReturnStatement |
LabeledStatement | BreakStatement | Con