1、什么是AST(抽象語(yǔ)法樹)
抽象語(yǔ)法樹是源代碼語(yǔ)法結(jié)構(gòu)的一種抽象表示。
它以樹狀的形式表現(xiàn)編程語(yǔ)言的語(yǔ)法結(jié)構(gòu),樹上的每個(gè)節(jié)點(diǎn)都表示源代碼中的一種結(jié)構(gòu)。
1.1、簡(jiǎn)單認(rèn)識(shí)AST在線解析網(wǎng)站
AST在線解析網(wǎng)站(https://astexplorer.net/)
如下圖所示,左邊是我們的源代碼,右邊是代碼的樹狀結(jié)構(gòu)

之后的講解是使用babel庫(kù)操作ast,所以需要選擇@babel/parser
選擇不同的庫(kù),源代碼的樹狀結(jié)構(gòu)也會(huì)有所不同,但差別不是太大

樹結(jié)構(gòu)節(jié)點(diǎn)名詞解釋:
1.type: 表示當(dāng)前節(jié)點(diǎn)的類型,我們常用的類型判斷方法t.is******(node),就是判斷當(dāng)前的節(jié)點(diǎn)是否為某個(gè)類型。
2.start: 表示當(dāng)前節(jié)點(diǎn)的起始位。
3.end: 表示當(dāng)前節(jié)點(diǎn)的末尾。
4.loc : 表示當(dāng)前節(jié)點(diǎn)所在的行列位置,里面也有start與end節(jié)點(diǎn),這里的start與上面的start是不同的,這里的start是表示節(jié)點(diǎn)所在起始的行列位。置,而end表示的是節(jié)點(diǎn)所在末尾的行列位置。
5.errors:是File節(jié)點(diǎn)所特有的屬性,可以不用理會(huì)。
6.program:包含整個(gè)源代碼,不包含注釋節(jié)點(diǎn)。
7.comments:源代碼中所有的注釋會(huì)在這里顯示。
2、AST語(yǔ)法樹講解
2.1實(shí)例
我們使用在線解析網(wǎng)站去拆解一個(gè)簡(jiǎn)單的add函數(shù)
function add(a, b) {
return a + b
}
打開網(wǎng)站后左邊是原函數(shù)代碼,右邊是ast解析后的語(yǔ)法樹

2.2講解
參考https://blog.csdn.net/weixin_39408343/article/details/95984062
function add(a, b) {
return a + b
}
先將這個(gè)函數(shù)拆成了基本的三塊:
一個(gè)id,就是它的名字,即add
兩個(gè)params,就是它的參數(shù),即[a, b]
一塊body,也就是大括號(hào)內(nèi)的一堆東西

add沒辦法繼續(xù)拆下去了,它是一個(gè)最基礎(chǔ)Identifier(標(biāo)志)對(duì)象,用來(lái)作為函數(shù)的唯一標(biāo)志,就像人的姓名一樣。

params繼續(xù)拆下去,其實(shí)是兩個(gè)Identifier組成的數(shù)組。之后也沒辦法拆下去了。

body繼續(xù)拆下去
body其實(shí)是一個(gè)BlockStatement(塊狀域)對(duì)象,用來(lái)表示是{return a + b}

打開Blockstatement,里面藏著一個(gè)ReturnStatement(Return域)對(duì)象,用來(lái)表示return a + b

繼續(xù)打開ReturnStatement,里面是一個(gè)BinaryExpression(二進(jìn)制表達(dá)式)對(duì)象,用來(lái)表示a + b

繼續(xù)打開BinaryExpression,它成了三部分,left,operator,right
operator 即+
left 里面裝的,是Identifier對(duì)象 a
right 里面裝的,是Identifer對(duì)象 b

就這樣,我們把一個(gè)簡(jiǎn)單的add函數(shù)拆解完畢,用圖表示就是

傳送門
AST(抽象語(yǔ)法樹)的學(xué)習(xí)第二講——ast分析代碼步驟的拆解
http://www.itdecent.cn/p/bef7fa8bf92a
AST(抽象語(yǔ)法樹)的學(xué)習(xí)第三講——ast分析常用節(jié)點(diǎn)及方法
http://www.itdecent.cn/p/7ccdfac7cf79
AST(抽象語(yǔ)法樹)的學(xué)習(xí)第四講——實(shí)戰(zhàn)ast
http://www.itdecent.cn/p/78405d38bb82