是否有任何框架支持AST节点访问事件?

时间:2016-05-27 18:23:05

标签: javascript json parsing abstract-syntax-tree esprima

在使用Esprima JavaScript解析器(从JS源代码生成JSON格式的AST)时,我注意到如果我可以注册节点类型(字符串)并在此时触发事件将会很方便访问节点类型,例如:

ASTFramework.on("Identifier", function(evt){
  /*Some code here*/
});

通过进行一些研究,似乎JSHint在内部实现了这样的功能,但是它的API无法提供。对此有什么建议吗?

编辑:我想要做的是,能够注册事件,以便在访问AST节点时被触发。简而言之,在特定的JSON节点访问中触发事件的框架就足够了。

2 个答案:

答案 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)) {
          ...
        }
      }
    }
  },
}

更多信息:Babel Plugin Handbook

答案 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),因此很容易指定哪些类型需要考虑进行操作,即使它们深深嵌套在其他节点中也是如此。