2011-02-02 47 views
6

Ripper是Ruby 1.9附帶的解析庫。它把Ruby代碼爲AST,就像這樣:我會如何將Ripper的AST重新編譯回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]]]] 

是否有一個圖書館藉此AST並將其轉換回Ruby代碼?

ruby_parser and ruby2ruby用於做到這一點,但我想使用Ripper作爲我的分析器。 (Ruby 1.9甚至可能帶有這樣的庫,但我仍然努力尋找文檔,即使在開膛手本身)

+0

我玩過https://github.com/svenfuchs/ripper2ruby http://www.artweb-design.de/2009/7/5/ripper2ruby-modify-and-recompile-your-ruby-code ,但它在NoMethodError:未定義的方法`to_ruby'中爲#而死。不知道該從哪裏出發。 – 2011-02-02 20:35:28

+0

我發現在某些時候,但它似乎並不可靠。感謝您提供您的體驗。 – 2011-02-02 20:55:11

回答

4

請參閱「Sorcerer」。這很好,但我在解析方法時發現了一個錯誤。如果您在文件「lib/sorcerer/resource.rb」的第301行下面添加src.emit("; "),這將會被修復。但是如果你決定使用這個,你可能會發現更多。祝你好運。