在使用Esprima JavaScript解析器(从JS源代码生成JSON格式的AST)时,我注意到如果我可以注册节点类型(字符串)并在此时触发事件将会很方便访问节点类型,例如:
ASTFramework.on("Identifier", function(evt){
/*Some code here*/
});
通过进行一些研究,似乎JSHint在内部实现了这样的功能,但是它的API无法提供。对此有什么建议吗?
编辑:我想要做的是,能够注册事件,以便在访问AST节点时被触发。简而言之,在特定的JSON节点访问中触发事件的框架就足够了。答案 0 :(得分:1)
您可以使用babel,它可以转换JS(并触发您想要的事件)。
我写了一个简单的plugin,可以将x[-1]
转换为x[x.length -1]
,这可以帮助您入门。
代码如下所示:
visitor: {
MemberExpression(path) {
const node = path.node;
/* obj[...] */
if (t.isMemberExpression(node) && node.computed) {
if (t.isUnaryExpression(node.property) && node.property.operator === "-") {
if (t.isNumericLiteral(node.property.argument)) {
...
}
}
}
},
}
答案 1 :(得分:0)
我发现搜索AST节点遍历最接近的是工具estraverse,这使我能够访问节点并检查类型以便采取行动:
//Using require from Node.js here to add module.
var estraverse = require("estraverse");
//Rest of code....
estraverse.traverse(astTree, {
enter: function (node) {
if(node.type == "Identifier") {
//Do something
} else if(node.type == "Literal") {
//Do something else, etc
}
}
});
由于estraverse
访问了所有节点(可能使用DFS),因此很容易指定哪些类型需要考虑进行操作,即使它们深深嵌套在其他节点中也是如此。