0

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

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

通过进行一些研究,JSHint似乎在内部实现了此类功能,但无法从其 API 中获得。对此有什么建议吗?

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

4

2 回答 2

1

我发现搜索 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),所以很容易指定要考虑哪些类型的操作,即使它们深深嵌套在其他节点中。

于 2016-06-02T08:39:03.143 回答
1

您可以使用babel,它可以转换 JS(并根据需要触发事件)。

我写了一个简单的插件,它可以转换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 插件手册

于 2016-06-02T08:45:24.037 回答