什么是JavaScript AST,如何玩它?

时间:2013-04-21 04:28:47

标签: javascript abstract-syntax-tree

抽象语法树..我总是听说在Github上编译为SpiderMonkey AST 那么,这是JS语法树的实际标准吗?还有V8,是V8使用相同类型的AST吗?

我该怎么玩?

5 个答案:

答案 0 :(得分:44)

1.您可以查看AST explorer。一个在线工具,用于探索由10多个解析器生成的AST。它是学习语言AST树的好工具 AST explorer source at Github.com

enter image description here


2.您也可以将您的js代码粘贴到JavaScript AST visualizer并点击"显示ast"按钮,你会看到AST visully。

demo js code:

function foo(d) {
  d += 3;
    return d+999
}
function bar(d) {
    return d*100
}

js ast demo

答案 1 :(得分:26)

SpiderMonkey提供parser api。这可能是获取语法对象的最简单方法。

还有开放的 js-js 解析器,如Esprima(这是ECMAScript,真的,但它就在巷子里)

答案 2 :(得分:2)

如果您想尝试Marijnh教授的acron解析器 https://github.com/marijnh试用此链接:https://astexplorer.net/

这是一个小巧,快速的JavaScript解析器,完全用JavaScript编写。

上述JavaScript AST visualizer使用Esprima引擎,也是用JavaScrpt编写的。

JavaScript在解析AST方面占主导地位,因为今天JavaScript引擎已经过优化。 https://en.wikipedia.org/wiki/JavaScript_engine

  

JS语法树的SpiderMonkey AST标准? V8是否使用相同类型的AST?

这两个Web浏览器引擎都在内部使用C ++编写的AST处理。这就是为什么JavaScrpt代码在除eval之外的大多数情况下都能快速运行的原因。

答案 3 :(得分:1)

抽象语法树(AST),是程序源代码的树状表示。

有几个 JavaScript AST 标准:

以下是 JavaScript 解析器列表:

您可以在 astexplorer.net 上找到更多解析器,其中大部分与 estree 兼容。

虽然大多数支持 estree 的解析器可以很容易地相互替换,但 babel 具有使用 AST 舒适工作所需的非常广泛的基础设施。 它有:

  • handbook 描述所有工具及其使用方法。
  • @babel/traverse - 维护树的整体状态,并负责替换、移除和添加节点;
  • @babel/template - 从字符串创建 AST 节点的最简单方法。
  • @babel/types - 包含 AST 节点的构建器和检查器。

使用 AST 的最简单方法之一是使用 putout,它基于 babel 并支持在 JavaScript 的帮助下转换 DebuggerStatement 代码的简化方式{3}}。

以下是删除 module.exports.replace = () => ({ 'debugger': '', }); 节点的示例:

module.exports.replace = () => ({
    'let __a = __b': 'const __b = __a'
});

如果你想切换变量的位置,改变声明的方式:

return x[0]

如果您想将此代码转换为 for (const x of y) { return x; }

module.exports.replace = () => ({
    'for (const __a of __b) {return __a}': 'return __a[0]',
});

您可以使用:

putout

借助 JavaScript,您可以对 AST 代码进行最简单的转换,而无需直接使用 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "OPTIONS,POST,GET,HEAD,DELETE,PUT" Header always set Access-Control-Allow-Headers "x-requested-with,Content-Type,origin,authorization,accept,client-sent-security-token" Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"

答案 4 :(得分:0)

我只知道一种Java AST规范:https://github.com/estree/estree

它起源于Mozilla的Dave Herman出版,从那以后发展成为社区标准。因此它应该在某种程度上与SpiderMonkey相匹配,但是我不确定V8和JSC。

如果有人可以提供更多有关此事的信息,将不胜感激。