1糊饱、什么是AST(抽象語法樹)
抽象語法樹是源代碼語法結(jié)構(gòu)的一種抽象表示挟炬。
它以樹狀的形式表現(xiàn)編程語言的語法結(jié)構(gòu)皂冰,樹上的每個(gè)節(jié)點(diǎn)都表示源代碼中的一種結(jié)構(gòu)梗肝。
1.1蔫饰、簡單認(rèn)識AST在線解析網(wǎng)站
AST在線解析網(wǎng)站(https://astexplorer.net/)
如下圖所示,左邊是我們的源代碼,右邊是代碼的樹狀結(jié)構(gòu)
之后的講解是使用babel庫操作ast鹃唯,所以需要選擇@babel/parser
選擇不同的庫,源代碼的樹狀結(jié)構(gòu)也會有所不同瓣喊,但差別不是太大
樹結(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)所特有的屬性,可以不用理會逾苫。
6.program:包含整個(gè)源代碼,不包含注釋節(jié)點(diǎn)。
7.comments:源代碼中所有的注釋會在這里顯示鹅髓。
2陷寝、AST語法樹講解
2.1實(shí)例
我們使用在線解析網(wǎng)站去拆解一個(gè)簡單的add函數(shù)
function add(a, b) {
return a + b
}
打開網(wǎng)站后左邊是原函數(shù)代碼,右邊是ast解析后的語法樹
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便斥,也就是大括號內(nèi)的一堆東西
add沒辦法繼續(xù)拆下去了,它是一個(gè)最基礎(chǔ)Identifier(標(biāo)志)對象威始,用來作為函數(shù)的唯一標(biāo)志枢纠,就像人的姓名一樣。
params繼續(xù)拆下去黎棠,其實(shí)是兩個(gè)Identifier組成的數(shù)組晋渺。之后也沒辦法拆下去了。
body繼續(xù)拆下去
body其實(shí)是一個(gè)BlockStatement(塊狀域)對象脓斩,用來表示是{return a + b}
打開Blockstatement木西,里面藏著一個(gè)ReturnStatement(Return域)對象,用來表示return a + b
繼續(xù)打開ReturnStatement,里面是一個(gè)BinaryExpression(二進(jìn)制表達(dá)式)對象随静,用來表示a + b
繼續(xù)打開BinaryExpression八千,它成了三部分吗讶,left,operator恋捆,right
operator 即+
left 里面裝的照皆,是Identifier對象 a
right 里面裝的,是Identifer對象 b
就這樣沸停,我們把一個(gè)簡單的add函數(shù)拆解完畢膜毁,用圖表示就是
傳送門
AST(抽象語法樹)的學(xué)習(xí)第二講——ast分析代碼步驟的拆解
http://www.reibang.com/p/bef7fa8bf92a
AST(抽象語法樹)的學(xué)習(xí)第三講——ast分析常用節(jié)點(diǎn)及方法
http://www.reibang.com/p/7ccdfac7cf79
AST(抽象語法樹)的學(xué)習(xí)第四講——實(shí)戰(zhàn)ast
http://www.reibang.com/p/78405d38bb82