访问V8引擎的抽象语法树

11

是否可以访问给定JavaScript代码的v8引擎AST?我正在使用V8引擎开发JavaScript静态分析器。


2
可能是重复问题:如何访问V8解析树,该如何实现? - zengr
3个回答

13

这篇文章可能有些旧了,但或许对那些偶然遇到这个问题的人有所帮助。答案是肯定的,前提是你愿意修改V8并编译自己的版本。

如果是这样,那么在compiler.cc中,你可以找到在MakeFunctionInfo中调用MakeCode的地方,该函数将存储在传入的CompilationInfo对象中的AST转换为本地代码。你需要编写一个从AstVisitor继承的类,然后在调用MakeCode之前插入以下行以检查AST:

MyAstVisitor mAV;
// this will call VisitFunctionLiteral in your AST visitor
info->function()->Accept(mAV);

由于V8在实际调用函数时即时编译,所以在CompileLazy中还有另一个位置,您需要在此处执行相同的操作,以便在调用脚本的执行过程中获取它们的AST。由于延迟编译的原因,这可能不会使您能够进行静态分析,因为在您访问惰性编译内容的AST之前,执行已经在进行中。但这是获取AST的方法。

2

使用 SetFlagsFromString 来启用 --print-ast


2
我认为 OP 想要访问 AST 作为一个数据结构,他可以遍历。的确,他可以像这样导出并构建自己的 AST 阅读器,并遍历自己的数据结构,但我怀疑他想尽可能避免那种笨拙的事情。 - Ira Baxter
1
你知道那个标志是否仍然存在吗? - Juan Picado

1

嗯,我不知道你想要实现什么,但听起来你想从C++代码内部修改AST(或者为JavaScript上下文编写包装类?)。

我建议查看头文件,这些文件相当详细地解释了V8的AST中可用的内容:

http://v8.googlecode.com/svn/trunk/src/ast.h

祝福您一切顺利


该链接已失效。 - rayaqin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接