實現一個AST解釋器(續(xù)):簡化的AST
在之前的文章《JavaScript黑科技:實現一個AST解釋器》中,提到了用于執(zhí)行的、簡化的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是一種方法,但不太便捷。
作為程序員,最理所當然的方法,自然是用程序生成。
在NodeJS中可以用babel方便的生成JavaScript代碼的AST。如下所示:
但此AST含有代碼行號、位置、注釋等眾多冗長信息。
因此,還需再進一步,去除這些不需要的內容。
去除方法,即是從AST這個JSON對像中刪除不需要節(jié)點。代碼如下:
var parser = require("@babel/parser");
//從JS代碼生成AST
var js_code = "console.log("jshaman");"
var ast = parser.parse(js_code);
//簡化AST
minify_ast(ast);
function minify_ast(ast){
for(var key in ast){
//要刪除的節(jié)點名稱
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é)點:", key);
delete ast[key]
}
}
if(typeof(ast[key]) == "object"){
console.log("進入子節(jié)點:", JSON.stringify(ast[key]));
minify_ast(ast[key]);
}
}
return ast;
}
ast = JSON.stringify(ast);
console.log("簡化后的AST:", ast);
運行結果如下:
由圖中可見,最終生成了簡化的AST。
責任編輯:Rex_08