實(shí)現(xiàn)一個(gè)AST解釋器(續(xù)):簡(jiǎn)化的AST
在之前的文章《JavaScript黑科技:實(shí)現(xiàn)一個(gè)AST解釋器》中,提到了用于執(zhí)行的、簡(jiǎn)化的AST。
形如:
{"type":"File","program":{"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"CallExpression","callee":{"type":"MemberExpression","object":{"type":"Identifier","name":"console"},"property":{"type":"Identifier","name":"log"}},"arguments":[{"type":"StringLiteral","value":"jshaman"}]}}]}}
AST如何獲得呢?
使用astexplorer是一種方法,但不太便捷。
作為程序員,最理所當(dāng)然的方法,自然是用程序生成。
在NodeJS中可以用babel方便的生成JavaScript代碼的AST。如下所示:
但此AST含有代碼行號(hào)、位置、注釋等眾多冗長(zhǎng)信息。
因此,還需再進(jìn)一步,去除這些不需要的內(nèi)容。
去除方法,即是從AST這個(gè)JSON對(duì)像中刪除不需要節(jié)點(diǎn)。代碼如下:
var parser = require("@babel/parser");
//從JS代碼生成AST
var js_code = "console.log("jshaman");"
var ast = parser.parse(js_code);
//簡(jiǎn)化AST
minify_ast(ast);
function minify_ast(ast){
for(var key in ast){
//要?jiǎng)h除的節(jié)點(diǎn)名稱
var delete_ast_types = ["start","end","loc","errors","comments","directives"];
for(i=0; i< delete_ast_types.length; i++){
if(key == delete_ast_types[i]){
console.log("刪除AST節(jié)點(diǎn):", key);
delete ast[key]
}
}
if(typeof(ast[key]) == "object"){
console.log("進(jìn)入子節(jié)點(diǎn):", JSON.stringify(ast[key]));
minify_ast(ast[key]);
}
}
return ast;
}
ast = JSON.stringify(ast);
console.log("簡(jiǎn)化后的AST:", ast);
運(yùn)行結(jié)果如下:
由圖中可見(jiàn),最終生成了簡(jiǎn)化的AST。
責(zé)任編輯:Rex_08