抽象语法树..我总是听说在Github上编译为SpiderMonkey AST 那么,这是JS语法树的实际标准吗?还有V8,是V8使用相同类型的AST吗?
我该怎么玩?
答案 0 :(得分:44)
1.您可以查看AST explorer。一个在线工具,用于探索由10多个解析器生成的AST。它是学习语言AST树的好工具 AST explorer source at Github.com
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
}
答案 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 解析器列表:
acorn
,用于 eslint;acorn
,支持所有新语言功能Shift AST
您可以在 astexplorer.net 上找到更多解析器,其中大部分与 estree
兼容。
虽然大多数支持 estree
的解析器可以很容易地相互替换,但 babel
具有使用 AST
舒适工作所需的非常广泛的基础设施。
它有:
AST
节点的最简单方法。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。
如果有人可以提供更多有关此事的信息,将不胜感激。