61

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

我该怎么玩呢?

4

5 回答 5

59

1.你可以看看AST explorer。一个在线工具,用于探索由 10 多个解析器生成的 AST。它是学习一门语言的 AST 树的好工具。
Github.com 上的 AST 资源管理器

在此处输入图像描述


2.您也可以将您的js代码粘贴到JavaScript AST可视化工具中,然后单击“show ast”按钮,您将看到AST。

演示js代码:

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

js ast 演示

于 2015-04-13T05:35:25.150 回答
29

SpiderMonkey 提供解析器 api。这可能是掌握语法对象的最简单方法。

还有像Esprima这样的开放式js-js解析器(实际上是 ECMAScript,但它就在小巷里)

于 2013-04-21T04:36:37.887 回答
4

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

有几个 JavaScriptAST标准:

以下是 JavaScript 解析器列表:

您可以在astexplorer.net上找到更多解析器,其中大多数是estree兼容的。

虽然大多数支持的解析器estree可以很容易地相互替换,但它们babel具有非常广泛的基础设施,可以轻松使用AST. 它有:

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

最简单的方法之一AST是使用putout,它基于并支持借助插件 APIbabel转换代码的简化方法。JavaScript

这是删除DebuggerStatement节点的示例:

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

于 2021-02-14T09:42:26.063 回答
2

如果你想试试 Marijnh 教授的 acron 解析器 https://github.com/marijnh试试这个链接:https ://astexplorer.net/

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

上面提到的JavaScript AST 可视化器使用了 Esprima 引擎,并且也是用 JavaScrpt 编写的。

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

JS语法树的SpiderMonkey AST标准?V8 使用的是同一种 AST 吗?

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

于 2016-10-25T12:11:51.933 回答
0

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

它起源于 Mozilla 的 Dave Herman 的出版物,并从那时起演变为社区标准。所以它应该在某种程度上与 SpiderMonkey 匹配,但我不确定 V8 和 JSC。

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

于 2019-08-13T10:51:03.840 回答