首页 > 空调 >

实现一个AST解释器(续):简化的AST

实现一个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

关键词: parser type NodeJS
推荐阅读