抽象语法树

217 阅读2分钟

AST(Abstract Syntax Tree)抽象语法树

ast是编译语言编译过程中的一个重要概念,它是源代码语法结构的抽象语法树的树状描述

下面是AST的一些节点类型

Base:AST节点的基类;

Identifier: 标识符

Literal:字面量;

RegExpLiteral:正则表达式;

Program: 整个Javascript程序;

ReturnStatement:返回语句;

BinaryExpression:二进制表达式(表达两个操作数之间的二元操作符表达式,这种类型的表达式会把两个值合并成为一个新值。在大多数编程语言中,符号“+”、“-”、“*”和“/”都是二进制操作符)

Function:函数定义

FunctionDeclaration:函数声明;

FunctionExpansion:函数表达式;

ArrowFunctionExpression:箭头函数表达式

Statement:语句

BlockStatement: 语句块,一系列由{}包裹的语句

EmptyStatement: 空语句,由单个分号组成

ExpressionStatement: 表达式语句

IfStatement: 带有"if"和(或)“else”的分支语句

LabeledStatement: 标注语句

BreakStatement: "break"语句

ContinueStatement: "continue"语句

WithStatement: "with"语句

SwitchStatement: "switch"语句

ReturnStatement: "return"语句

ThrowStatement: 抛出异常语句

TryStatement: "try"语句

WhileStatement: "while"语句

DoWhileStatement: "do-while"语句

ForStatement: "for"语句

ForInStatement: "for-in"语句

ForOfStatement: "for-of"语句

DebuggerStatement: “debugger”语句,用于调试

Expression: 表达式

ThisExpression: 表示 this 关键字的表达式

ArrayExpression: 数组字面量

ObjectExpression: 对象字面量

FunctionExpression: 函数表达式

UnaryExpression: 一元表达式,如 “delete” 或 “void”

BinaryExpression: 二元表达式,如 “+” 或 “-”

AssignmentExpression: 赋值表达式

LogicalExpression: 逻辑运算表达式

MemberExpression: 属性访问表达式,如 a.b 或者 a[“b”]

ConditionalExpression: 三元表达式,如 x ? y : z

CallExpression: 函数调用表达式

NewExpression: 构造函数调用表达式

SequenceExpression: 逗号表达式,由多个子表达式组成

 function double(x) {
     return x*2;
 }
 //这段代码的抽象语法树可以被表示为
 FunctionDeclaration
 -Identifier(name: "double")
 -FunctionExpression
   -Identifier(name: "x")
   -BlockStatement
     -ReturnStatement
       -BinaryExpression
       -Identifier(name:"x")
       -Literal(value: 2)
       -operator: *

值得注意的是,语法树的节点层级以及先后顺序都与当前代码的结构有关,并不固定.如果代码发生了改变,那么语法树的结构也会改变.

虽然节点的顺序并不固定,但也并非无迹可寻,节点遵守以下规则:

1.每个节点都有一个父节点,零个或者多个子节点

2.父节点永远在子节点之前进行解析,使得节点在AST中是递归关系,确保代码的顺序通读是从左到右,从上到下

3.高级类型的节点是低级类型节点的容器,而低级类型的节点是高级类型节点容器的组成部分.高级节点类型反映了语言语义的抽象层次,低级节点则对操作数和操作符以及字面量等细节的实现进行了分解和描述