2011-08-01 30 views
7

Có thể lấy AST của một khối từ chính Ruby không?Trích xuất AST từ khối Ruby

Tôi đã xem cả hai ParseTree và ruby_parser, nhưng cả hai đều có vẻ hỗ trợ sơ sài (từ những gì tôi đã đọc) cho Ruby 1.9.2. Tôi cần một cái gì đó hoạt động tốt với 1.9.2.

Trả lời

7

Ripper được bao gồm trong MRI 1,9 ra khỏi hộp.

ruby-1.9.2-p180 :004 > require 'ripper' 
=> true 
ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end") 
=> [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]] 

Trong 1.8, Ruby thực thi mã bằng cách đi qua AST, vì vậy có thể lấy AST cho phương thức/khối đã cho. Trong 1.9 nó không phải như vậy; mã được phân tích cú pháp đầu tiên, sau đó được chuyển thành mã bytecode YARV và sau đó được thực hiện. Không phải là nguồn, cũng như AST được lưu giữ sau bước dịch, và sau này không thể đảo ngược được; do đó bạn không thể lấy AST cho một khối trong 1,9.

+0

Làm cách nào để sử dụng Ripper để lấy AST từ một khối? Tôi giả sử tôi sẽ phải lấy mã nguồn cho khối bằng cách nào đó. –

+0

Cảm ơn thông tin! Có vẻ như bạn cần phải làm 'yêu cầu' ripper'' để nó hoạt động. –

+0

Ồ. Xin lỗi, tôi nên đọc kỹ bài đăng của bạn hơn. Tôi đã cập nhật câu trả lời. – whitequark