2012-02-26 34 views
8

Có thể truy cập AST của động cơ v8, đối với mã JavaScript đã cho không? Tôi đang làm việc trên Máy phân tích tĩnh JavaScript sử dụng công cụ V8.Truy cập cây cú pháp trừu tượng của động cơ V8

+1

có thể trùng lặp của [Làm thế nào để tôi truy cập v8 phân tích cây làm thế nào nó có thể được thực hiện?] (Http://stackoverflow.com/questions/8550774/how-do-i-access-v8-parse-tree-how- có thể làm được) – zengr

Trả lời

10

này là khá cũ nhưng có lẽ câu trả lời giúp ai đó vấp phải điều này. Câu trả lời là có, giả sử bạn sẵn sàng sửa đổi V8 và biên dịch phiên bản của riêng bạn.

Nếu vậy, thì trong compiler.cc bạn tìm một chỗ nơi MakeCode được gọi suốt MakeFunctionInfo mà biến đổi AST được lưu trữ trong các thông qua trong đối tượng CompilationInfo thành code gốc. Bạn cần phải viết một lớp kế thừa từ AstVisitor sau đó bạn có thể kiểm tra việc AST bằng cách chèn các dòng sau đây trước khi cuộc gọi đến MakeCode:

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

Như V8 biên dịch chức năng just-in-time khi họ đang thực sự được gọi, có một vị trí khác trong CompileLazy nơi bạn sẽ phải thực hiện tương tự để có được AST của chúng trong suốt quá trình thực thi các tập lệnh gọi.

Vì điều biên dịch lười biếng, điều này có thể sẽ không cho phép bạn thực hiện phân tích tĩnh, bởi vì quá trình thực hiện đã diễn ra trước khi bạn có quyền truy cập vào các AST cho các công cụ được biên dịch một cách lười biếng. Nhưng đây là cách để có được AST.

1

Sử dụng --print-ast qua SetFlagsFromString

+1

Tôi nghĩ OP muốn truy cập vào AST như một cơ sở dữ liệu mà anh ta có thể thu thập thông tin. Đúng, anh ta có thể xuất khẩu như thế này và xây dựng đầu đọc AST của riêng mình, và thu thập dữ liệu cấu trúc dữ liệu của riêng mình, nhưng tôi nghi ngờ anh ta muốn tránh sự vụng về đó nếu có thể. –

+0

Bạn có biết lá cờ đó vẫn còn tồn tại không? –

0

Vâng, tôi không biết những gì bạn muốn đạt được, nhưng có vẻ như bạn muốn thay đổi AST từ bên trong C++ mã (hoặc có thể viết các lớp wrapper cho bối cảnh Javascript cho họ là tốt?).

Tôi đề nghị để có một cái nhìn tại các tập tin tiêu đề mà khá giải thích gì đó để được sử dụng trên AST V8 của:

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

~ Chúc mừng

Các vấn đề liên quan