2011-02-02 32 views
6

Ripper là thư viện phân tích cú pháp đi kèm với Ruby 1.9. Nó biến đổi mã Ruby vào một AST, như vậy:Tôi sẽ biên dịch lại mã của Ripper như thế nào về mã Ruby?

pp Ripper.sexp("def foo; yield :a; return 1 end") 

#=> 

[:program, 
[[:def, 
    [:@ident, "foo", [1, 4]], 
    [:params, nil, nil, nil, nil, nil], 
    [:bodystmt, 
    [[:yield, 
     [:args_add_block, 
     [[:symbol_literal, [:symbol, [:@ident, "a", [1, 16]]]]], 
     false]], 
    [:return, [:args_add_block, [[:@int, "1", [1, 26]]], false]]], 
    nil, 
    nil, 
    nil]]]] 

Có một thư viện để lấy AST này và biến nó trở thành mã Ruby?

ruby_parser and ruby2ruby được sử dụng để thực hiện việc này, nhưng tôi muốn sử dụng Ripper làm trình phân tích cú pháp của mình. (Ruby 1.9 thậm chí có thể gửi cùng với một thư viện như vậy, nhưng tôi đang cố gắng tìm tài liệu ngay cả trên chính Ripper)

+0

Tôi đã chơi xung quanh với https://github.com/svenfuchs/ripper2ruby cho http://www.artweb-design.de/2009/7/5/ripper2ruby-modify-and-recompile-your-ruby-code , nhưng nó đã chết với NoMethodError: phương thức undefined 'to_ruby 'cho # . Không chắc chắn đi đâu từ đó. –

+0

Tôi thấy rằng tại một số điểm, nhưng nó chỉ có vẻ không đáng tin cậy. Cảm ơn bạn đã cung cấp trải nghiệm với nó. –

Trả lời

4

Xem "Sorcerer". Điều này hoạt động tốt nhưng tôi đã tìm thấy lỗi khi phân tích cú pháp phương pháp. Nếu bạn thêm src.emit("; ") bên dưới dòng 301 của tệp "lib/sorcerer/resource.rb", điều này sẽ được sửa. Nhưng bạn có thể tìm thấy nhiều hơn nếu bạn quyết định sử dụng điều này. Chúc may mắn.

+0

Cảm ơn - điều này có vẻ như là điều tốt nhất hiện có tại thời điểm này! –

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