抽象语法树(简称AST)。我在Github上经常听到将其编译为SpiderMonkey AST的说法。
那么,这是JS语法树的实际标准吗?V8是否使用相同类型的AST?
我该如何与它互动?
抽象语法树(简称AST)。我在Github上经常听到将其编译为SpiderMonkey AST的说法。
那么,这是JS语法树的实际标准吗?V8是否使用相同类型的AST?
我该如何与它互动?
1.您可以查看AST Explorer,这是一个在线工具,可用于探索超过10个解析器生成的AST。这是学习语言AST树的好工具。
AST explorer源代码在Github.com上。
2.此外,您还可以将JavaScript代码粘贴到JavaScript AST visualizer中,并单击“show ast”按钮,以直观的方式查看AST。
演示JS代码:
function foo(d) {
d += 3;
return d+999
}
function bar(d) {
return d*100
}
抽象语法树(AST)是程序源代码的树形表示。
有几个JavaScript AST
标准:
以下是JavaScript解析器列表:
acorn
,用于eslint;acorn
,支持所有新的语言特性Shift AST
您可以在astexplorer.net上找到更多解析器,其中大多数都兼容estree
。
尽管大多数支持estree
的解析器可以轻松地相互替换,但babel
具有非常丰富的基础设施,可使其舒适地使用AST
。
它拥有:
AST
节点的最简单方法。AST
节点的构建器和检查器。玩弄AST
的最简单方法之一是使用putout,它基于babel
,并支持通过插件API简化转换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
,您可以在不直接处理AST
的情况下对JavaScript
代码进行最简单的转换。
eval
之外。我只知道一个Javascript AST规范:https://github.com/estree/estree
它起源于Mozilla的Dave Herman的出版物,自那时以来已经发展成为社区标准。因此它应该在某种程度上与SpiderMonkey匹配,但我不确定V8和JSC是否也适用。
如果有人能提供更多相关信息,将不胜感激。