实现一个AST解释器(续):简化的AST
在之前的文章《JavaScript黑科技:实现一个AST解释器》中,提到了用于执行的、简化的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对像中删除不需要节点。代码如下:
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){
//要删除的节点名称
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节点:", key);
delete ast[key]
}
}
if(typeof(ast[key]) == "object"){
console.log("进入子节点:", JSON.stringify(ast[key]));
minify_ast(ast[key]);
}
}
return ast;
}
ast = JSON.stringify(ast);
console.log("简化后的AST:", ast);
运行结果如下:
由图中可见,最终生成了简化的AST。
责任编辑:Rex_08