抽象语法树.. 我总是听说在 Github 上编译为 SpiderMonkey AST。
那么,这是 JS 语法树的实际标准吗?还有 V8,V8 使用的是同一种 AST 吗?
我该怎么玩呢?
抽象语法树.. 我总是听说在 Github 上编译为 SpiderMonkey AST。
那么,这是 JS 语法树的实际标准吗?还有 V8,V8 使用的是同一种 AST 吗?
我该怎么玩呢?
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
}
SpiderMonkey 提供解析器 api。这可能是掌握语法对象的最简单方法。
还有像Esprima这样的开放式js-js解析器(实际上是 ECMAScript,但它就在小巷里)
抽象语法树 (AST),是程序源代码的树形表示。
有几个 JavaScriptAST
标准:
以下是 JavaScript 解析器列表:
acorn
,用在eslint中;acorn
,支持所有新的语言特性Shift AST
您可以在astexplorer.net上找到更多解析器,其中大多数是estree
兼容的。
虽然大多数支持的解析器estree
可以很容易地相互替换,但它们babel
具有非常广泛的基础设施,可以轻松使用AST
. 它有:
AST
-从字符串创建 -node 的最简单方法。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
。
如果你想试试 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
.
我只知道一种 Javascript AST 规范:https ://github.com/estree/estree
它起源于 Mozilla 的 Dave Herman 的出版物,并从那时起演变为社区标准。所以它应该在某种程度上与 SpiderMonkey 匹配,但我不确定 V8 和 JSC。
如果有人可以提供有关此事的更多信息,将不胜感激。