AST抽象語法樹
代碼都可以拆解成抽象語法樹霸褒,語法樹解析網(wǎng)站:https://astexplorer.net/
作用:AST不依賴于具體的文法伴找,不依賴于語言的細節(jié),我們將源代碼轉化為AST后废菱,可以對AST做很多的操作技矮,包括一些你想不到的操作,這些操作實現(xiàn)了各種各樣形形色色的功能殊轴,
簡介:抽象語法樹(abstract syntax code衰倦,AST)是源代碼的抽象語法結構的樹狀表示,樹上的每個節(jié)點都表示源代碼中的一種結構梳凛,這所以說是抽象的耿币,是因為抽象語法樹并不會表示出真實語法出現(xiàn)的每一個細節(jié),比如說韧拒,嵌套括號被隱含在樹的結構中淹接,并沒有以節(jié)點的形式呈現(xiàn)。抽象語法樹并不依賴于源語言的語法叛溢,也就是說語法分析階段所采用的上下文無文文法塑悼,因為在寫文法時,經(jīng)常會對文法進行等價的轉換(消除左遞歸楷掉,回溯厢蒜,二義性等),這樣會給文法分析引入一些多余的成分,對后續(xù)階段造成不利影響斑鸦,甚至會使合個階段變得混亂愕贡。因些,很多編譯器經(jīng)常要獨立地構造語法分析樹巷屿,為前端固以,后端建立一個清晰的接口。
抽象語法樹在很多領域有廣泛的應用嘱巾,比如瀏覽器憨琳,智能編輯器,編譯器旬昭。
AST具體的一些介紹可以查看此處https://www.codercto.com/a/47843.html
babel插件處理語法樹
babel-traverse?獲取可以獲取節(jié)點路徑Path
path的屬性和方法
── 屬性
? - node? 當前節(jié)點??
- parent? 父節(jié)點?
?- parentPath 父path
? - scope? 作用域??
- context? 上下文
── 方法?
?- get? 當前節(jié)點??
- findParent? 向父節(jié)點搜尋節(jié)點?
?- getSibling 獲取兄弟節(jié)點
? - replaceWith? 用AST節(jié)點替換該節(jié)點?
?- replaceWithMultiple 用多個AST節(jié)點替換該節(jié)點??
- insertBefore? 在節(jié)點前插入節(jié)點??
- insertAfter 在節(jié)點后插入節(jié)點?
?- remove? 刪除節(jié)點
獲取同級路徑
如果一個路徑是在一個?Function/Program中的列表里面篙螟,它就有同級節(jié)點。
使用path.inList來判斷路徑是否有同級節(jié)點问拘,
使用path.getSibling(index)來獲得同級路徑,
使用?path.key獲取路徑所在容器的索引,
使用?path.container獲取路徑的容器(包含所有同級節(jié)點的數(shù)組)
使用?path.listKey獲取容器的key
babel插件的使用 查看此處https://blog.csdn.net/weixin_33826609/article/details/93164633#toc-babel-traverse
使用demo實現(xiàn)m-modal 遍略,change事件的添加合并
function?varExp(value,?path)?{??
????var?exp?=?$util.parseMmodal(path)
????if?(exp.type?===?$.MERGE?&&?exp.FunNode.value.body){
??????//?獲取原onchange事件
??????let?funBody?=?exp.FunNode.value.body
??????//?刪除原onchange事件
??????if?(path.inList){
????????let?siblingNode?=?path.container
????????siblingNode.forEach((item,index)?=>?{
??????????if(item.key.name?===?'onChange'){
????????????path.getSibling(index).remove()
??????????}
????????})
??????}
??????return?t.objectProperty(??
????????t.stringLiteral('onChange'),?
????????t.arrowFunctionExpression(
????????????[t.identifier('v')],
????????????t.BlockStatement(
??????????????[t.expressionStatement(
????????????????t.AssignmentExpression(
??????????????????"=",t.identifier(value),t.identifier('v.value')
????????????????)
??????????????),?
????????????????t.expressionStatement(
????????????????funBody
??????????????)
?????????????]
????????????)?????
????????)
??????)?
????}?
????return?t.objectProperty(??//抽象語法樹,解析對象數(shù)场梆,拷貝或者創(chuàng)建一個對象
??????t.stringLiteral('onChange'),??//拷貝或者創(chuàng)建change事件
??????t.arrowFunctionExpression(
??????????[t.identifier('v')],
??????????{
???????????????type:?'BinaryExpression',
???????????????left:?t.identifier(value),?
???????????????"operator":?"=",
???????????????"right":??t.identifier('v.value')
???????????}
??????)
????)?
?}