AST抽象语法树(Abstract Syntax Tree)
一、AST抽象语法树是什么?
抽象语法树(Abstract Syntax Tree),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口
二、例子
工具https://astexplorer.net/
1、简单的定义一个变量
var a = 10;
抽象语法树
{
"type": "Program",
"start": 0,
"end": 11,
"body": [
{
"type": "VariableDeclaration",
"start": 0,
"end": 11,
"declarations": [
{
"type": "VariableDeclarator",
"start": 4,
"end": 10,
"id": {
"type": "Identifier",
"start": 4,
"end": 5,
"name": "a"
},
"init": {
"type": "Literal",
"start": 8,
"end": 10,
"value": 10,
"raw": "10"
}
}
],
"kind": "var"
}
],
"sourceType": "module"
}
2、四则运算
1+3*(4-1)+2
抽象语法树
{
"type": "Program",
"start": 0,
"end": 11,
"body": [
{
"type": "ExpressionStatement",
"start": 0,
"end": 11,
"expression": {
"type": "BinaryExpression",
"start": 0,
"end": 11,
"left": {
"type": "BinaryExpression",
"start": 0,
"end": 9,
"left": {
"type": "Literal",
"start": 0,
"end": 1,
"value": 1,
"raw": "1"
},
"operator": "+",
"right": {
"type": "BinaryExpression",
"start": 2,
"end": 9,
"left": {
"type": "Literal",
"start": 2,
"end": 3,
"value": 3,
"raw": "3"
},
"operator": "*",
"right": {
"type": "BinaryExpression",
"start": 5,
"end": 8,
"left": {
"type": "Literal",
"start": 5,
"end": 6,
"value": 4,
"raw": "4"
},
"operator": "-",
"right": {
"type": "Literal",
"start": 7,
"end": 8,
"value": 1,
"raw": "1"
}
}
}
},
"operator": "+",
"right": {
"type": "Literal",
"start": 10,
"end": 11,
"value": 2,
"raw": "2"
}
}
}
],
"sourceType": "module"
}
三、作用
描述静态分析的程序语法(静态分析是在不需要执行代码的前提下对代码进行分析的处理过程 (执行代码的同时进行代码分析即是动态分析)。 静态分析的目的是多种多样的, 它可用于语法检查,编译,代码高亮,代码转换,优化,压缩等等场景。